Page 1 of 1

Example of how to run an expert advisor in several currency pairs simultaneously

Posted: Wed Apr 12, 2017 8:46 am
by Lonesome
Below is the script for an expert advisor that simultaneously checks in 10 currency pairs.

Code: Select all

library PriceAction2;

//This EA works with 10 currency pairs. Each is optional.
//For each currency pair one order can be placed at one time.
//The EA works with 2 timeframes. The 4 hr and the 8 hr timeframe.
//Other timeframes can be added by adding timeframe specific procedures.
//The EA contains a MessageBox for script testing purposes.
//There are procedures for checking buy and sell conditions and for executing a buy order.
//The strategy can easily be changed by modifying just these 3 procedures.

uses
  SysUtils, StrategyInterfaceUnit, DateUtils, Windows;

var
  // external parameters
  SymbolName1: PAnsiChar = 'AUDJPY';
  SymbolName2: PAnsiChar = 'AUDUSD';
  SymbolName3: PAnsiChar = 'EURCAD';
  SymbolName4: PAnsiChar = 'EURJPY';
  SymbolName5: PAnsiChar = 'EURUSD';
  SymbolName6: PAnsiChar = 'GBPJPY';
  SymbolName7: PAnsiChar = 'GBPUSD';
  SymbolName8: PAnsiChar = 'USDCAD';
  SymbolName9: PAnsiChar = 'USDCHF';
  SymbolName10: PAnsiChar = 'USDJPY';
  SymbolName: PAnsiChar = nil;
  Name1,Name2,Name3,Name4,Name5,Name6,Name7,Name8,Name9,Name10: boolean;
  Timeframe: integer;
  LastTime: TDateTime;
  StopLoss: integer;
  TakeProfit: integer;
  Entry: integer;
  Lot: double = 1.0;

  // local variables
  Open0,Open1,Open2,Open3,Open4,Open5,Open6,Open7:double;
  Close0,Close1,Close2,Close3,Close4,Close5,Close6,Close7:double;
  High0,High1,High2,High3,High4,High5,High6,High7:double;
  Low0,Low1,Low2,Low3,Low4,Low5,Low6,Low7:double;
  BuyCondition,SellCondition:boolean;
  Hr4TimeFrame,Hr8TimeFrame:boolean;
  Ti0,Ti1,Ti2,Ti3,Ti3last:double;
  OrdersSymbol1: integer = 0;
  OrdersSymbol2: integer = 0;
  OrdersSymbol3: integer = 0;
  OrdersSymbol4: integer = 0;
  OrdersSymbol5: integer = 0;
  OrdersSymbol6: integer = 0;
  OrdersSymbol7: integer = 0;
  OrdersSymbol8: integer = 0;
  OrdersSymbol9: integer = 0;
  OrdersSymbol10: integer = 0;
  OrdersSymbolTemp: integer = 0;
  Calc0, Calc1:double;

{-----Init strategy---------------------------------------------------------}
procedure InitStrategy; stdcall;
begin
  // set strategy name and description
  StrategyShortName('Price Action #2');
  StrategyDescription('find reversal on high (sell stop)');

  // register parameters
  RegOption('AUDJPY',ot_Boolean, Name1);
  RegOption('AUDUSD',ot_Boolean, Name2);
  RegOption('EURCAD',ot_Boolean, Name3);
  RegOption('EURJPY',ot_Boolean, Name4);
  RegOption('EURUSD',ot_Boolean, Name5);
  RegOption('GBPJPY',ot_Boolean, Name6);
  RegOption('GBPUSD',ot_Boolean, Name7);
  RegOption('USDCAD',ot_Boolean, Name8);
  RegOption('USDCHF',ot_Boolean, Name9);
  RegOption('USDJPY',ot_Boolean, Name10);
  AddSeparator('Trading options');
  RegOption('Timeframe (4 hr or 8 hr only', ot_TimeFrame, Timeframe);
  RegOption('Lot', Lot, 1, 0.1, 10);
  RegOption('Entry (pips below previous low)', Entry, 1, 100000);
  RegOption('Take Profit (pips below previous low)', TakeProfit, 1, 100000);
  RegOption('Stop Loss (pips above previous high)', StopLoss, 1, 100000);
  end;

{-----Done strategy---------------------------------------------------------}
procedure DoneStrategy; stdcall;
begin
  FreeMem(SymbolName1);
  FreeMem(SymbolName2);
  FreeMem(SymbolName3);
  FreeMem(SymbolName4);
  FreeMem(SymbolName5);
  FreeMem(SymbolName6);
  FreeMem(SymbolName7);
  FreeMem(SymbolName8);
  FreeMem(SymbolName9);
  FreeMem(SymbolName10);
  end;

{-----Reset strategy--------------------------------------------------------}
procedure ResetStrategy; stdcall;
begin
  LastTime := 0;    // reset options before new test
end;

{-----Message Box-----------------------------------------------}
procedure MessageWindow; stdcall;
begin
  MessageBox(0, PChar('Hour:    '+FloatToStr(Ti0)+#13#10+
            'Minute:  '+FloatToStr(Ti1)+#13#10+
            'Second:  '+FloatToStr(Ti2)+#13#10+
            'MilliSecond:  '+FloatToStr(Ti3)+#13#10+
            '-------------------------------------'+#13#10+
            'Open(0):  '+FloatToStr(Open0)+#13#10+
            'High(0):  '+FloatToStr(High0)+#13#10+
            'Low(0):   '+FloatToStr(Low0)+#13#10+
            'Close(0): '+FloatToStr(Close0)+#13#10+
            '-------------------------------------'+#13#10+
            'Open(1):  '+FloatToStr(Open1)+#13#10+
            'High(1):  '+FloatToStr(High1)+#13#10+
            'Low(1):   '+FloatToStr(Low1)+#13#10+
            'Close(1): '+FloatToStr(Close1)+#13#10+
            '-------------------------------------'+#13#10+
            'Open(2):  '+FloatToStr(Open2)+#13#10+
            'High(2):  '+FloatToStr(High2)+#13#10+
            'Low(2):   '+FloatToStr(Low2)+#13#10+
            'Close(2): '+FloatToStr(Close2)+#13#10+
            '-------------------------------------'+#13#10+
            'Open(3):  '+FloatToStr(Open3)+#13#10+
            'High(3):  '+FloatToStr(High3)+#13#10+
            'Low(3):   '+FloatToStr(Low3)+#13#10+
            'Close(3): '+FloatToStr(Close3)+#13#10+
            '-------------------------------------'+#13#10+
            'Open(4):  '+FloatToStr(Open4)+#13#10+
            'High(4):  '+FloatToStr(High4)+#13#10+
            'Low(4):   '+FloatToStr(Low4)+#13#10+
            'Close(4): '+FloatToStr(Close4)+#13#10+
            '-------------------------------------'+#13#10+
            'Open(5):  '+FloatToStr(Open5)+#13#10+
            'High(5):  '+FloatToStr(High5)+#13#10+
            'Low(5):   '+FloatToStr(Low5)+#13#10+
            'Close(5): '+FloatToStr(Close5)+#13#10+
            '-------------------------------------'+#13#10+
            'Open(6):  '+FloatToStr(Open6)+#13#10+
            'High(6):  '+FloatToStr(High6)+#13#10+
            'Low(6):   '+FloatToStr(Low6)+#13#10+
            'Close(6): '+FloatToStr(Close6)+#13#10+
            '-------------------------------------'+#13#10+
            'Open(7):  '+FloatToStr(Open7)+#13#10+
            'High(7):  '+FloatToStr(High7)+#13#10+
            'Low(7)    '+FloatToStr(Low7)+#13#10+
            'Close(7): '+FloatToStr(Close7)),PChar('Last prices'), MB_OK);
end;

{-----Get Open High Low Close-----------------------------------------------}
procedure OHLC; stdcall;
begin
  Open0:=iOpen(SymbolName,Timeframe,0);
  Open1:=iOpen(SymbolName,Timeframe,1);
  Open2:=iOpen(SymbolName,Timeframe,2);
  Open3:=iOpen(SymbolName,Timeframe,3);
  Open4:=iOpen(SymbolName,Timeframe,4);
  Open5:=iOpen(SymbolName,Timeframe,5);
  Open6:=iOpen(SymbolName,Timeframe,6);
  Open7:=iOpen(SymbolName,Timeframe,7);

  Close0:=iClose(SymbolName,Timeframe,0);
  Close1:=iClose(SymbolName,Timeframe,1);
  Close2:=iClose(SymbolName,Timeframe,2);
  Close3:=iClose(SymbolName,Timeframe,3);
  Close4:=iClose(SymbolName,Timeframe,4);
  Close5:=iClose(SymbolName,Timeframe,5);
  Close6:=iClose(SymbolName,Timeframe,6);
  Close7:=iClose(SymbolName,Timeframe,7);

  High0:=iHigh(SymbolName,Timeframe,0);
  High1:=iHigh(SymbolName,Timeframe,1);
  High2:=iHigh(SymbolName,Timeframe,2);
  High3:=iHigh(SymbolName,Timeframe,3);
  High4:=iHigh(SymbolName,Timeframe,4);
  High5:=iHigh(SymbolName,Timeframe,5);
  High6:=iHigh(SymbolName,Timeframe,6);
  High7:=iHigh(SymbolName,Timeframe,7);

  Low0:=iLow(SymbolName,Timeframe,0);
  Low1:=iLow(SymbolName,Timeframe,1);
  Low2:=iLow(SymbolName,Timeframe,2);
  Low3:=iLow(SymbolName,Timeframe,3);
  Low4:=iLow(SymbolName,Timeframe,4);
  Low5:=iLow(SymbolName,Timeframe,5);
  Low6:=iLow(SymbolName,Timeframe,6);
  Low7:=iLow(SymbolName,Timeframe,7);
 end;

{-----4 hr Timeframe Checker-------------------------------------------------}
procedure Hr4Frame; stdcall;
begin
  Hr4TimeFrame := false;
  if (Ti0 = 23) or (Ti0 = 3) or (Ti0 = 7) or (Ti0 = 11) or (Ti0 = 15) or (Ti0 = 19) then
    begin
      if (Ti1 = 59) and (Ti2 = 0) and (Ti3 <> Ti3last) then
        Begin
          Hr4TimeFrame := true;
        End;
    end;
end;

{-----8 hr Timeframe Checker-------------------------------------------------}
procedure Hr8Frame; stdcall;
begin
  Hr8TimeFrame := false;
  if (Ti0 = 23) or (Ti0 = 7) or (Ti0 = 15) then
    begin
      if (Ti1 = 59) and (Ti2 = 0) and (Ti3 <> Ti3last) then
        Begin
          Hr8TimeFrame := true;
        End;
    end;
end;

{-----Buy Condition Checker--------------------------------------------------}
procedure BuyConditionCheck; stdcall;
begin
  BuyCondition := false;

  Calc0 := (Open0 + Close0)/2;
  Calc1 := Close1/Open5;
  if (Calc1 > 1.005) and (Open0>Close0) and (Close1>Close2) and (Close2>Close3) and (Close3>Close4) and (Open1<Close1) and (Open2<Close2) and (Open3<Close3) then
    begin
        BuyCondition := true;
    end;
end;

{-----Sell Condition Checker------------------------------------------------}
procedure SellConditionCheck; stdcall;
Begin
  SellCondition := false;

  if Close0 > Open0 then
    Begin
      SellCondition := true;
    End;
End;

{-----Buy Executor---------------------------------------------------------}
procedure BuyExecutor; stdcall;
var
  Position,Multiplier:integer;
Begin

  Multiplier := 1;
  Position := AnsiPos('JPY', SymbolName);
  if Position <> 0 then
   begin
    Multiplier := 100;
   end;

  SendPendingOrder(SymbolName, op_SellStop, Lot, High0 + StopLoss*Point*Multiplier, Low0 - TakeProfit*Point*Multiplier, Low0 - Entry*Point*Multiplier, '', 0, OrdersSymbolTemp);

End;

{-----Sell Or Delete Order Checker------------------------------------------}
procedure SellOrDeleteOrderChecker; stdcall;
Begin
  if (Name1 = true) and (OrdersSymbol1 <> 0) then        //AUDJPY
    Begin
      if (Timeframe = 240) then Hr4Frame;
      if (Timeframe = 480) then Hr8Frame;
      if (Hr4TimeFrame = true) or (Hr8TimeFrame = true) then
        begin
          SymbolName := SymbolName1;
          OHLC;
          SellConditionCheck;
          if (SellCondition = true) then
            Begin
              DeleteOrder(OrdersSymbol1);
              CloseOrder(OrdersSymbol1);
              OrdersSymbol1 := 0;
            End;
        end;
    end;

  if (Name2 = true) and (OrdersSymbol2 <> 0) then        //AUDUSD
    Begin
      if (Timeframe = 240) then Hr4Frame;
      if (Timeframe = 480) then Hr8Frame;
      if (Hr4TimeFrame = true) or (Hr8TimeFrame = true) then
        begin
          SymbolName := SymbolName2;
          OHLC;
          SellConditionCheck;
          if (SellCondition = true) then
            Begin
              DeleteOrder(OrdersSymbol2);
              CloseOrder(OrdersSymbol2);
              OrdersSymbol2 := 0;
            End;
        end;
    end;

  if (Name3 = true) and (OrdersSymbol3 <> 0) then        //EURCAD
    Begin
      if (Timeframe = 240) then Hr4Frame;
      if (Timeframe = 480) then Hr8Frame;
      if (Hr4TimeFrame = true) or (Hr8TimeFrame = true) then
        begin
          SymbolName := SymbolName3;
          OHLC;
          SellConditionCheck;
          if (SellCondition = true) then
            Begin
              DeleteOrder(OrdersSymbol3);
              CloseOrder(OrdersSymbol3);
              OrdersSymbol3 := 0;
            End;
        end;
    end;

  if (Name4 = true) and (OrdersSymbol4 <> 0) then        //EURJPY
    Begin
      if (Timeframe = 240) then Hr4Frame;
      if (Timeframe = 480) then Hr8Frame;
      if (Hr4TimeFrame = true) or (Hr8TimeFrame = true) then
        begin
          SymbolName := SymbolName4;
          OHLC;
          SellConditionCheck;
          if (SellCondition = true) then
            Begin
              DeleteOrder(OrdersSymbol4);
              CloseOrder(OrdersSymbol4);
              OrdersSymbol4 := 0;
            End;
        end;
    end;

  if (Name5 = true) and (OrdersSymbol5 <> 0) then        //EURUSD
    Begin
      if (Timeframe = 240) then Hr4Frame;
      if (Timeframe = 480) then Hr8Frame;
      if (Hr4TimeFrame = true) or (Hr8TimeFrame = true) then
        begin
          SymbolName := SymbolName5;
          OHLC;
          SellConditionCheck;
          if (SellCondition = true) then
            Begin
              DeleteOrder(OrdersSymbol5);
              CloseOrder(OrdersSymbol5);
              OrdersSymbol5 := 0;
            End;
        end;
    end;

  if (Name6 = true) and (OrdersSymbol6 <> 0) then        //GBPJPY
    Begin
      if (Timeframe = 240) then Hr4Frame;
      if (Timeframe = 480) then Hr8Frame;
      if (Hr4TimeFrame = true) or (Hr8TimeFrame = true) then
        begin
          SymbolName := SymbolName6;
          OHLC;
          SellConditionCheck;
          if (SellCondition = true) then
            Begin
              DeleteOrder(OrdersSymbol6);
              CloseOrder(OrdersSymbol6);
              OrdersSymbol6 := 0;
            End;
        end;
    end;

  if (Name7 = true) and (OrdersSymbol7 <> 0) then        //GBPUSD
    Begin
      if (Timeframe = 240) then Hr4Frame;
      if (Timeframe = 480) then Hr8Frame;
      if (Hr4TimeFrame = true) or (Hr8TimeFrame = true) then
        begin
          SymbolName := SymbolName7;
          OHLC;
          SellConditionCheck;
          if (SellCondition = true) then
            Begin
              DeleteOrder(OrdersSymbol7);
              CloseOrder(OrdersSymbol7);
              OrdersSymbol7 := 0;
            End;
        end;
    end;

  if (Name8 = true) and (OrdersSymbol8 <> 0) then        //USDCAD
    Begin
      if (Timeframe = 240) then Hr4Frame;
      if (Timeframe = 480) then Hr8Frame;
      if (Hr4TimeFrame = true) or (Hr8TimeFrame = true) then
        begin
          SymbolName := SymbolName8;
          OHLC;
          SellConditionCheck;
          if (SellCondition = true) then
            Begin
              DeleteOrder(OrdersSymbol8);
              CloseOrder(OrdersSymbol8);
              OrdersSymbol8 := 0;
            End;
        end;
    end;

  if (Name9 = true) and (OrdersSymbol9 <> 0) then        //USDCHF
    Begin
      if (Timeframe = 240) then Hr4Frame;
      if (Timeframe = 480) then Hr8Frame;
      if (Hr4TimeFrame = true) or (Hr8TimeFrame = true) then
        begin
          SymbolName := SymbolName9;
          OHLC;
          SellConditionCheck;
          if (SellCondition = true) then
            Begin
              DeleteOrder(OrdersSymbol9);
              CloseOrder(OrdersSymbol9);
              OrdersSymbol9 := 0;
            End;
        end;
    end;

  if (Name10 = true) and (OrdersSymbol10 <> 0) then        //USDJPY
    Begin
      if (Timeframe = 240) then Hr4Frame;
      if (Timeframe = 480) then Hr8Frame;
      if (Hr4TimeFrame = true) or (Hr8TimeFrame = true) then
        begin
          SymbolName := SymbolName10;
          OHLC;
          SellConditionCheck;
          if (SellCondition = true) then
            Begin
              DeleteOrder(OrdersSymbol10);
              CloseOrder(OrdersSymbol10);
              OrdersSymbol10 := 0;
            End;
        end;
    end;

end;

{-----Process single tick---------------------------------------------------}
procedure GetSingleTick; stdcall;
begin

  if (Timeframe = 480) or (Timeframe = 240) then
    begin
    end
  else
    exit;

  Ti0:=HourOf(TimeCurrent);
  Ti1:=MinuteOf(TimeCurrent);
  Ti2:=SecondOf(TimeCurrent);
  Ti3:=MillisecondOf(TimeCurrent);

  SetCurrencyAndTimeFrame(SymbolName1, Timeframe);
  SetCurrencyAndTimeFrame(SymbolName2, Timeframe);
  SetCurrencyAndTimeFrame(SymbolName3, Timeframe);
  SetCurrencyAndTimeFrame(SymbolName4, Timeframe);
  SetCurrencyAndTimeFrame(SymbolName5, Timeframe);
  SetCurrencyAndTimeFrame(SymbolName6, Timeframe);
  SetCurrencyAndTimeFrame(SymbolName7, Timeframe);
  SetCurrencyAndTimeFrame(SymbolName8, Timeframe);
  SetCurrencyAndTimeFrame(SymbolName9, Timeframe);
  SetCurrencyAndTimeFrame(SymbolName10, Timeframe);

  SellOrDeleteOrderChecker;

  if (Name1 = true) and (OrdersSymbol1 = 0) then    //AUDJPY
    Begin
      if (Timeframe = 240) then Hr4Frame;
      if (Timeframe = 480) then Hr8Frame;
      if (Hr4TimeFrame = true) or (Hr8TimeFrame = true) then
        begin
          SymbolName := SymbolName1;
          OrdersSymbolTemp := OrdersSymbol1;
          OHLC;
          BuyConditionCheck;
          if (BuyCondition = true) then
          begin
            BuyExecutor;
            OrdersSymbol1 := OrdersSymbolTemp;
          end;
        end;
    end;

  if (Name2 = true) and (OrdersSymbol2 = 0) then     //AUDUSD
    Begin
      if (Timeframe = 240) then Hr4Frame;
      if (Timeframe = 480) then Hr8Frame;
      if (Hr4TimeFrame = true) or (Hr8TimeFrame = true) then
        begin
          SymbolName := SymbolName2;
          OrdersSymbolTemp := OrdersSymbol2;
          OHLC;
          BuyConditionCheck;
          if (BuyCondition = true) then
          begin
            BuyExecutor;
            OrdersSymbol2 := OrdersSymbolTemp;
          end;
        end;
    end;

  if (Name3 = true) and (OrdersSymbol3 = 0) then     //EURCAD
    Begin
      if (Timeframe = 240) then Hr4Frame;
      if (Timeframe = 480) then Hr8Frame;
      if (Hr4TimeFrame = true) or (Hr8TimeFrame = true) then
        begin
          SymbolName := SymbolName3;
          OrdersSymbolTemp := OrdersSymbol3;
          OHLC;
          BuyConditionCheck;
          if (BuyCondition = true) then
          begin
            BuyExecutor;
            OrdersSymbol3 := OrdersSymbolTemp;
          end;
        end;
    end;

   if (Name4 = true) and (OrdersSymbol4 = 0) then    //EURJPY
    Begin
      if (Timeframe = 240) then Hr4Frame;
      if (Timeframe = 480) then Hr8Frame;
      if (Hr4TimeFrame = true) or (Hr8TimeFrame = true) then
        begin
          SymbolName := SymbolName4;
          OrdersSymbolTemp := OrdersSymbol4;
          OHLC;
          BuyConditionCheck;
          if (BuyCondition = true) then
          begin
            BuyExecutor;
            OrdersSymbol4 := OrdersSymbolTemp;
          end;
        end;
    end;

  if (Name5 = true) and (OrdersSymbol5 = 0) then     //EURUSD
    Begin
      if (Timeframe = 240) then Hr4Frame;
      if (Timeframe = 480) then Hr8Frame;
      if (Hr4TimeFrame = true) or (Hr8TimeFrame = true) then
        begin
          SymbolName := SymbolName5;
          OrdersSymbolTemp := OrdersSymbol5;
          OHLC;
          BuyConditionCheck;
          if (BuyCondition = true) then
          begin
            BuyExecutor;
            OrdersSymbol5 := OrdersSymbolTemp;
          end;
        end;
    end;

   if (Name6 = true) and (OrdersSymbol6 = 0) then    //GBPJPY
    Begin
      if (Timeframe = 240) then Hr4Frame;
      if (Timeframe = 480) then Hr8Frame;
      if (Hr4TimeFrame = true) or (Hr8TimeFrame = true) then
        begin
          SymbolName := SymbolName6;
          OrdersSymbolTemp := OrdersSymbol6;
          OHLC;
          BuyConditionCheck;
          if (BuyCondition = true) then
          begin
            BuyExecutor;
            OrdersSymbol6 := OrdersSymbolTemp;
          end;
        end;
    end;

  if (Name7 = true) and (OrdersSymbol7 = 0) then     //GBPUSD
    Begin
      if (Timeframe = 240) then Hr4Frame;
      if (Timeframe = 480) then Hr8Frame;
      if (Hr4TimeFrame = true) or (Hr8TimeFrame = true) then
        begin
          SymbolName := SymbolName7;
          OrdersSymbolTemp := OrdersSymbol7;
          OHLC;
          BuyConditionCheck;
          if (BuyCondition = true) then
          begin
            BuyExecutor;
            OrdersSymbol7 := OrdersSymbolTemp;
          end;
        end;
    end;

  if (Name8 = true) and (OrdersSymbol8 = 0) then     //USDCAD
    Begin
      if (Timeframe = 240) then Hr4Frame;
      if (Timeframe = 480) then Hr8Frame;
      if (Hr4TimeFrame = true) or (Hr8TimeFrame = true) then
        begin
          SymbolName := SymbolName8;
          OrdersSymbolTemp := OrdersSymbol8;
          OHLC;
          BuyConditionCheck;
          if (BuyCondition = true) then
          begin
            BuyExecutor;
            OrdersSymbol8 := OrdersSymbolTemp;
          end;
        end;
    end;

   if (Name9 = true) and (OrdersSymbol9 = 0) then     //USDCHF
    Begin
      if (Timeframe = 240) then Hr4Frame;
      if (Timeframe = 480) then Hr8Frame;
      if (Hr4TimeFrame = true) or (Hr8TimeFrame = true) then
        begin
          SymbolName := SymbolName9;
          OrdersSymbolTemp := OrdersSymbol9;
          OHLC;
          BuyConditionCheck;
          if (BuyCondition = true) then
          begin
            BuyExecutor;
            OrdersSymbol9 := OrdersSymbolTemp;
          end;
        end;
    end;

   if (Name10 = true) and (OrdersSymbol10 = 0) then    //USDJPY
    Begin
      if (Timeframe = 240) then Hr4Frame;
      if (Timeframe = 480) then Hr8Frame;
      if (Hr4TimeFrame = true) or (Hr8TimeFrame = true) then
        begin
          SymbolName := SymbolName10;
          OrdersSymbolTemp := OrdersSymbol10;
          OHLC;
          BuyConditionCheck;
          if (BuyCondition = true) then
          begin
            BuyExecutor;
            OrdersSymbol10 := OrdersSymbolTemp;
          end;
        end;
    end;

    Ti3last := Ti3;
end;

exports

  InitStrategy,
  DoneStrategy,
  ResetStrategy,
  GetSingleTick;

begin


end.

Re: Example of how to run an expert advisor in several currency pairs simultaneously

Posted: Mon Apr 17, 2017 8:23 am
by Lonesome
In my previous script (PriceAction2) I fixed buying and selling to the time when candle 0 is competed. That either in the 4 or 8 hr timeframes.
I came to this because I was working with candle 0 as my first candle to determine the price action. Because the close, high and low are always fluctuating in candle 0 I limited buying to the time when candle 0 was one tick before closing.
All that can be avoided when one uses candle 1 as the first candle to determine price action. The outcome is somewhat different but more realistic and the EA can be used in any timeframe.

Code: Select all

library PriceAction3;

//This EA works with 10 currency pairs. Each is optional.
//There are procedures for checking buy and sell conditions and for executing a buy order.
//The strategy can easily be changed by modifying just these 3 procedures.

uses
  SysUtils, StrategyInterfaceUnit, DateUtils, Windows;

var
  // external parameters
  SymbolName1: PAnsiChar = 'AUDJPY';
  SymbolName2: PAnsiChar = 'AUDUSD';
  SymbolName3: PAnsiChar = 'EURCAD';
  SymbolName4: PAnsiChar = 'EURJPY';
  SymbolName5: PAnsiChar = 'EURUSD';
  SymbolName6: PAnsiChar = 'GBPJPY';
  SymbolName7: PAnsiChar = 'GBPUSD';
  SymbolName8: PAnsiChar = 'USDCAD';
  SymbolName9: PAnsiChar = 'USDCHF';
  SymbolName10: PAnsiChar = 'USDJPY';
  SymbolName: PAnsiChar = nil;
  Name1,Name2,Name3,Name4,Name5,Name6,Name7,Name8,Name9,Name10: boolean;
  IncreaseMin:double;
  LastTime: TDateTime;
  Timeframe: integer;
  StopLoss: integer;
  TakeProfit: integer;
  Entry: integer;
  Lot: double = 1.0;

  // local variables
  Open1,Open2,Open3,Open4,Open5,Open6,Open7:double;
  Close1,Close2,Close3,Close4,Close5,Close6,Close7:double;
  High1,High2,High3,High4,High5,High6,High7:double;
  Low1,Low2,Low3,Low4,Low5,Low6,Low7:double;
  BuyCondition,SellCondition:boolean;
  OrdersSymbol1: integer;
  OrdersSymbol2: integer;
  OrdersSymbol3: integer;
  OrdersSymbol4: integer;
  OrdersSymbol5: integer;
  OrdersSymbol6: integer;
  OrdersSymbol7: integer;
  OrdersSymbol8: integer;
  OrdersSymbol9: integer;
  OrdersSymbol10: integer;
  OrdersSymbolTemp: integer;
  Calc0, Calc1:double;

{-----Init strategy---------------------------------------------------------}
procedure InitStrategy; stdcall;
begin
  // set strategy name and description
  StrategyShortName('Price Action Temp');
  StrategyDescription('Reversal on high (sell stop)');

  // register parameters
  AddSeparator('Currency pair options');
  RegOption('AUDJPY',ot_Boolean, Name1);
  RegOption('AUDUSD',ot_Boolean, Name2);
  RegOption('EURCAD',ot_Boolean, Name3);
  RegOption('EURJPY',ot_Boolean, Name4);
  RegOption('EURUSD',ot_Boolean, Name5);
  RegOption('GBPJPY',ot_Boolean, Name6);
  RegOption('GBPUSD',ot_Boolean, Name7);
  RegOption('USDCAD',ot_Boolean, Name8);
  RegOption('USDCHF',ot_Boolean, Name9);
  RegOption('USDJPY',ot_Boolean, Name10);
  AddSeparator('Trading options');
  RegOption('Timeframe', ot_TimeFrame, Timeframe);
  RegOption('Lot', Lot, 1, 0.1, 10);
  RegOption('Entry (pips below low)', Entry, 1, 100000);
  RegOption('Take Profit (pips below low)', TakeProfit, 1, 100000);
  RegOption('Stop Loss (pips above high)', StopLoss, 1, 100000);
  RegOption('Price increase (Close2/Close4)', ot_double, IncreaseMin);
  SetOptionDigits('IncreaseMin', 3);
  end;

{-----Done strategy---------------------------------------------------------}
procedure DoneStrategy; stdcall;
begin
  FreeMem(SymbolName1);
  FreeMem(SymbolName2);
  FreeMem(SymbolName3);
  FreeMem(SymbolName4);
  FreeMem(SymbolName5);
  FreeMem(SymbolName6);
  FreeMem(SymbolName7);
  FreeMem(SymbolName8);
  FreeMem(SymbolName9);
  FreeMem(SymbolName10);
  end;

{-----Reset strategy--------------------------------------------------------}
procedure ResetStrategy; stdcall;
begin
  LastTime := 0;    // reset options before new test
end;

{-----Get Open High Low Close-----------------------------------------------}
procedure OHLC; stdcall;
begin
  Open1:=iOpen(SymbolName,Timeframe,1);
  Open2:=iOpen(SymbolName,Timeframe,2);
  Open3:=iOpen(SymbolName,Timeframe,3);
  Open4:=iOpen(SymbolName,Timeframe,4);
  Open5:=iOpen(SymbolName,Timeframe,5);
  Open6:=iOpen(SymbolName,Timeframe,6);
  Open7:=iOpen(SymbolName,Timeframe,7);

  Close1:=iClose(SymbolName,Timeframe,1);
  Close2:=iClose(SymbolName,Timeframe,2);
  Close3:=iClose(SymbolName,Timeframe,3);
  Close4:=iClose(SymbolName,Timeframe,4);
  Close5:=iClose(SymbolName,Timeframe,5);
  Close6:=iClose(SymbolName,Timeframe,6);
  Close7:=iClose(SymbolName,Timeframe,7);

  High1:=iHigh(SymbolName,Timeframe,1);
  High2:=iHigh(SymbolName,Timeframe,2);
  High3:=iHigh(SymbolName,Timeframe,3);
  High4:=iHigh(SymbolName,Timeframe,4);
  High5:=iHigh(SymbolName,Timeframe,5);
  High6:=iHigh(SymbolName,Timeframe,6);
  High7:=iHigh(SymbolName,Timeframe,7);

  Low1:=iLow(SymbolName,Timeframe,1);
  Low2:=iLow(SymbolName,Timeframe,2);
  Low3:=iLow(SymbolName,Timeframe,3);
  Low4:=iLow(SymbolName,Timeframe,4);
  Low5:=iLow(SymbolName,Timeframe,5);
  Low6:=iLow(SymbolName,Timeframe,6);
  Low7:=iLow(SymbolName,Timeframe,7);
 end;

{-----Buy Condition Checker--------------------------------------------------}
procedure BuyConditionCheck; stdcall;
begin
  BuyCondition := false;

  Calc0 := (Open1 + Close1)/2;
  Calc1 := Close2/Open4;
  if (Calc1 > IncreaseMin) and (Open1>Close1) and (Close2>Close3) and (Close3>Close4) and (Close4>Close5) and (Open2<Close2) and (Open3<Close3) and (Open4<Close4) then
    begin
        BuyCondition := true;
    end;
end;

{-----Sell Condition Checker------------------------------------------------}
procedure SellConditionCheck; stdcall;
Begin
  SellCondition := false;

  if Close1 > Open1 then
    Begin
      SellCondition := true;
    End;

End;

{-----Buy Executor---------------------------------------------------------}
procedure BuyExecutor; stdcall;
var
  Position,Multiplier:integer;
Begin

  Multiplier := 1;
  Position := AnsiPos('JPY', SymbolName);
  if Position <> 0 then
   begin
    Multiplier := 100;
   end;

  SendPendingOrder(SymbolName, op_SellStop, Lot, High1 + StopLoss*Point*Multiplier, Low1 - TakeProfit*Point*Multiplier, Low1 - Entry*Point*Multiplier, '', 0, OrdersSymbolTemp);

End;

{-----Sell Or Delete Order Checker------------------------------------------}
procedure SellOrDeleteOrderChecker; stdcall;
Begin
  if (Name1 = true) and (OrderClosed(OrdersSymbol1) = false) then        //AUDJPY
    Begin
      SymbolName := SymbolName1;
      OHLC;
      SellConditionCheck;
      if (SellCondition = true) then
        Begin
          DeleteOrder(OrdersSymbol1);
          CloseOrder(OrdersSymbol1);
        End;
    end;

  if (Name2 = true) and (OrderClosed(OrdersSymbol2) = false) then        //AUDUSD
    Begin
      SymbolName := SymbolName2;
      OHLC;
      SellConditionCheck;
      if (SellCondition = true) then
        Begin
          DeleteOrder(OrdersSymbol2);
          CloseOrder(OrdersSymbol2);
        End;
    end;

  if (Name3 = true) and (OrderClosed(OrdersSymbol3) = false) then        //EURCAD
    Begin
      SymbolName := SymbolName3;
      OHLC;
      SellConditionCheck;
      if (SellCondition = true) then
        Begin
          DeleteOrder(OrdersSymbol3);
          CloseOrder(OrdersSymbol3);
        End;
    end;

  if (Name4 = true) and (OrderClosed(OrdersSymbol4) = false) then        //EURJPY
    Begin
      SymbolName := SymbolName4;
      OHLC;
      SellConditionCheck;
      if (SellCondition = true) then
        Begin
          DeleteOrder(OrdersSymbol4);
          CloseOrder(OrdersSymbol4);
        End;
    end;

  if (Name5 = true) and (OrderClosed(OrdersSymbol5) = false) then        //EURUSD
    Begin
      SymbolName := SymbolName5;
      OHLC;
      SellConditionCheck;
      if (SellCondition = true) then
        Begin
          DeleteOrder(OrdersSymbol5);
          CloseOrder(OrdersSymbol5);
        End;
    end;

  if (Name6 = true) and (OrderClosed(OrdersSymbol6) = false) then        //GBPJPY
    Begin
      SymbolName := SymbolName6;
      OHLC;
      SellConditionCheck;
      if (SellCondition = true) then
        Begin
          DeleteOrder(OrdersSymbol6);
          CloseOrder(OrdersSymbol6);
        End;
    end;

  if (Name7 = true) and (OrderClosed(OrdersSymbol7) = false) then        //GBPUSD
    Begin
      SymbolName := SymbolName7;
      OHLC;
      SellConditionCheck;
      if (SellCondition = true) then
        Begin
          DeleteOrder(OrdersSymbol7);
          CloseOrder(OrdersSymbol7);
        End;
    end;

  if (Name8 = true) and (OrderClosed(OrdersSymbol8) = false) then        //USDCAD
    Begin
      SymbolName := SymbolName8;
      OHLC;
      SellConditionCheck;
      if (SellCondition = true) then
        Begin
          DeleteOrder(OrdersSymbol8);
          CloseOrder(OrdersSymbol8);
        End;
    end;

  if (Name9 = true) and (OrderClosed(OrdersSymbol9) = false) then        //USDCHF
    Begin
      SymbolName := SymbolName9;
      OHLC;
      SellConditionCheck;
      if (SellCondition = true) then
        Begin
          DeleteOrder(OrdersSymbol9);
          CloseOrder(OrdersSymbol9);
        End;
    end;

  if (Name10 = true) and (OrderClosed(OrdersSymbol10) = false) then        //USDJPY
    Begin
      SymbolName := SymbolName10;
      OHLC;
      SellConditionCheck;
      if (SellCondition = true) then
        Begin
          DeleteOrder(OrdersSymbol10);
          CloseOrder(OrdersSymbol10);
        End;
    end;

end;

{-----Process single tick---------------------------------------------------}
procedure GetSingleTick; stdcall;
begin

  if (Name1 = true) then SetCurrencyAndTimeFrame(SymbolName1, Timeframe);
  if (Name2 = true) then SetCurrencyAndTimeFrame(SymbolName2, Timeframe);
  if (Name3 = true) then SetCurrencyAndTimeFrame(SymbolName3, Timeframe);
  if (Name4 = true) then SetCurrencyAndTimeFrame(SymbolName4, Timeframe);
  if (Name5 = true) then SetCurrencyAndTimeFrame(SymbolName5, Timeframe);
  if (Name6 = true) then SetCurrencyAndTimeFrame(SymbolName6, Timeframe);
  if (Name7 = true) then SetCurrencyAndTimeFrame(SymbolName7, Timeframe);
  if (Name8 = true) then SetCurrencyAndTimeFrame(SymbolName8, Timeframe);
  if (Name9 = true) then SetCurrencyAndTimeFrame(SymbolName9, Timeframe);
  if (Name10 = true) then SetCurrencyAndTimeFrame(SymbolName10, Timeframe);

  SellOrDeleteOrderChecker;

  if (Name1 = true) and (OrderClosed(OrdersSymbol1) = true) then    //AUDJPY
    Begin
      SymbolName := SymbolName1;
      OHLC;
      BuyConditionCheck;
      if (BuyCondition = true) then
      begin
        BuyExecutor;
        OrdersSymbol1 := OrdersSymbolTemp;
      end;
    end;

  if (Name2 = true) and (OrderClosed(OrdersSymbol2) = true) then     //AUDUSD
    Begin
      SymbolName := SymbolName2;
      OHLC;
      BuyConditionCheck;
      if (BuyCondition = true) then
      begin
        BuyExecutor;
        OrdersSymbol2 := OrdersSymbolTemp;
      end;
    end;

  if (Name3 = true) and (OrderClosed(OrdersSymbol3) = true) then     //EURCAD
    Begin
      SymbolName := SymbolName3;
      OHLC;
      BuyConditionCheck;
      if (BuyCondition = true) then
      begin
        BuyExecutor;
        OrdersSymbol3 := OrdersSymbolTemp;
      end;
    end;

   if (Name4 = true) and (OrderClosed(OrdersSymbol4) = true) then    //EURJPY
    Begin
      SymbolName := SymbolName4;
      OHLC;
      BuyConditionCheck;
      if (BuyCondition = true) then
      begin
        BuyExecutor;
        OrdersSymbol4 := OrdersSymbolTemp;
      end;
    end;

  if (Name5 = true) and (OrderClosed(OrdersSymbol5) = true) then     //EURUSD
    Begin
      SymbolName := SymbolName5;
      OHLC;
      BuyConditionCheck;
      if (BuyCondition = true) then
      begin
        BuyExecutor;
        OrdersSymbol5 := OrdersSymbolTemp;
      end;
    end;

   if (Name6 = true) and (OrderClosed(OrdersSymbol6) = true) then    //GBPJPY
    Begin
      SymbolName := SymbolName6;
      OHLC;
      BuyConditionCheck;
      if (BuyCondition = true) then
      begin
        BuyExecutor;
        OrdersSymbol6 := OrdersSymbolTemp;
      end;
    end;

  if (Name7 = true) and (OrderClosed(OrdersSymbol7) = true) then     //GBPUSD
    Begin
      SymbolName := SymbolName7;
      OHLC;
      BuyConditionCheck;
      if (BuyCondition = true) then
      begin
        BuyExecutor;
        OrdersSymbol7 := OrdersSymbolTemp;
      end;
    end;

  if (Name8 = true) and (OrderClosed(OrdersSymbol8) = true) then     //USDCAD
    Begin
      SymbolName := SymbolName8;
      OHLC;
      BuyConditionCheck;
      if (BuyCondition = true) then
      begin
        BuyExecutor;
        OrdersSymbol8 := OrdersSymbolTemp;
      end;
    end;

   if (Name9 = true) and (OrderClosed(OrdersSymbol9) = true) then     //USDCHF
    Begin
      SymbolName := SymbolName9;
      OHLC;
      BuyConditionCheck;
      if (BuyCondition = true) then
      begin
        BuyExecutor;
        OrdersSymbol9 := OrdersSymbolTemp;
      end;
    end;

   if (Name10 = true) and (OrderClosed(OrdersSymbol10) = true) then    //USDJPY
    Begin
      SymbolName := SymbolName10;
      OHLC;
      BuyConditionCheck;
      if (BuyCondition = true) then
      begin
        BuyExecutor;
        OrdersSymbol10 := OrdersSymbolTemp;
      end;
    end;
end;

exports

  InitStrategy,
  DoneStrategy,
  ResetStrategy,
  GetSingleTick;

begin


end.