Как я могу заключить несколько сделок, когда условие выполнено? - PullRequest
0 голосов
/ 24 августа 2018

Я сделал советник (см. Код ниже). Это занимает всего одну сделку за раз. Существует несколько случаев, когда условия для входа в сделку выполняются более одного раза, но одновременно принимается только одна сделка. Как я могу сделать это новой сделкой, когда выполняется условие входа, и выйти из всех сделок, когда условие выхода выполнено?

extern int MagicNumber=10001;
extern double Lots =0.01;
double StopLoss=0;
double TakeProfit=50;
int TrailingStop=0;
int Slippage=3;

int start()
{
  double MyPoint=Point;
  if(Digits==3 || Digits==5) MyPoint=Point*10;

  double TheStopLoss=0;
  double TheTakeProfit=0;
  if( TotalOrdersCount()==0 ) 
  {
     int result=0;
     if(
     (iStochastic(NULL,PERIOD_M15,5,3,3,MODE_EMA,1,MODE_SIGNAL,0)<iStochastic(NULL,PERIOD_M15,5,3,3,MODE_EMA,1,MODE_MAIN,0))&&
 (iMACD(NULL,PERIOD_M15,12,26,1,PRICE_CLOSE,MODE_MAIN,1)<iMACD(NULL,PERIOD_M15,12,26,1,PRICE_CLOSE,MODE_MAIN,0)) 
     ) // Here is your open buy rule
     {
        result=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"Test",MagicNumber,0,Blue);
    Alert("BUY OPENED");
    //if(result>0)
    //{
    // TheStopLoss=0;
    // TheTakeProfit=0;
    // if(TakeProfit>0) TheTakeProfit=Ask+TakeProfit*MyPoint;
    // if(StopLoss>0) TheStopLoss=Ask-StopLoss*MyPoint;
    // OrderSelect(result,SELECT_BY_TICKET);
    // OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(TheStopLoss,Digits),NormalizeDouble(TheTakeProfit,Digits),0,Green);
    //}
    return(0);
 }
 if(
 (iStochastic(NULL,PERIOD_M15,5,3,3,MODE_EMA,1,MODE_SIGNAL,0)>iStochastic(NULL,PERIOD_M15,5,3,3,MODE_EMA,1,MODE_MAIN,0))&&
 (iMACD(NULL,PERIOD_M15,12,26,1,PRICE_CLOSE,MODE_MAIN,1)>iMACD(NULL,PERIOD_M15,12,26,1,PRICE_CLOSE,MODE_MAIN,0)) 
 ) // Here is your open Sell rule
 {
    result=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"EA Generator www.ForexEAdvisor.com",MagicNumber,0,Red);
    Alert("SELL OPENED");
    //if(result>0)
    //{
    // TheStopLoss=0;
    // TheTakeProfit=0;
    // if(TakeProfit>0) TheTakeProfit=Bid-TakeProfit*MyPoint;
    // if(StopLoss>0) TheStopLoss=Bid+StopLoss*MyPoint;
    // OrderSelect(result,SELECT_BY_TICKET);
    // OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(TheStopLoss,Digits),NormalizeDouble(TheTakeProfit,Digits),0,Green);
    //}
    return(0);
     }
  }

  for(int cnt=0;cnt<OrdersTotal();cnt++)
      {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
   if(OrderType()<=OP_SELL &&   
     OrderSymbol()==Symbol() &&
     OrderMagicNumber()==MagicNumber 
     )  
    {
     if(OrderType()==OP_BUY)  
       {
          if(
          (iStochastic(NULL,PERIOD_M15,5,3,3,MODE_EMA,1,MODE_SIGNAL,0)>iStochastic(NULL,PERIOD_M15,5,3,3,MODE_EMA,1,MODE_MAIN,0))&&
          (iMACD(NULL,PERIOD_M15,12,26,1,PRICE_CLOSE,MODE_MAIN,1)>iMACD(NULL,PERIOD_M15,12,26,1,PRICE_CLOSE,MODE_MAIN,0))) //here is your close buy rule
          {
               OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Slippage,Red);
               Alert("BUY CLOSED");
          }
        if(TrailingStop>0)  
          {                 
           if(Bid-OrderOpenPrice()>MyPoint*TrailingStop)
             {
              if(OrderStopLoss()<Bid-MyPoint*TrailingStop)
                {
                 OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TrailingStop*MyPoint,OrderTakeProfit(),0,Green);
                 return(0);
                }
             }
          }
       }
     else 
       {
            if(
            (iStochastic(NULL,PERIOD_M15,5,3,3,MODE_EMA,1,MODE_SIGNAL,0)<iStochastic(NULL,PERIOD_M15,5,3,3,MODE_EMA,1,MODE_MAIN,0))&&
            (iMACD(NULL,PERIOD_M15,12,26,1,PRICE_CLOSE,MODE_MAIN,1)<iMACD(NULL,PERIOD_M15,12,26,1,PRICE_CLOSE,MODE_MAIN,0))) // here is your close sell rule
            {
               OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Slippage,Red);
               Alert("SELL CLOSED");
            }
        if(TrailingStop>0)  
          {                 
           if((OrderOpenPrice()-Ask)>(MyPoint*TrailingStop))
             {
              if((OrderStopLoss()>(Ask+MyPoint*TrailingStop)) || (OrderStopLoss()==0))
                {
                 OrderModify(OrderTicket(),OrderOpenPrice(),Ask+MyPoint*TrailingStop,OrderTakeProfit(),0,Red);
                 return(0);
                }
             }
          }
       }
    }
 }
return(0);
}

int TotalOrdersCount()
{
  int result=0;
  for(int i=0;i<OrdersTotal();i++)
  {
     OrderSelect(i,SELECT_BY_POS ,MODE_TRADES);
     if (OrderMagicNumber()==MagicNumber) result++;

   }
  return (result);
}

1 Ответ

0 голосов
/ 24 августа 2018

Ваш код проверяет, есть ли хотя бы одна открытая сделка, или нет, используя функцию TotalOrdersCount(). Вам нужно удалить эту функцию, или скрыть ее или отредактировать, чтобы разрешить несколько сделок. В настоящее время советник проверяет количество сделок, открытых экспертами с одинаковым магическим номером (и, возможно, разными символами), и проверяет правила длинных / коротких позиций, только если количество открытых сделок равно нулю: см. Строку if( TotalOrdersCount()==0 ).

Если вам нужно найти последнюю открытую сделку - обновите TotalOrdersCount и получите время, либо глобальную переменную, либо передайте ее по ссылке.

int totalOrdersCount(datetime &lastOpenTrade)
  {
   int result=0; datetime last=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(!OrderSelect(i,SELECT_BY_POS))continue;
      if(OrderMagic()!=InpMagicNumber)continue;
      if(OrderSymbol()!=_Symbol)continue;
      result++;
      if(OrderOpenTime()>last)last=OrderOpenTime();
     }
   lastOpenTrade=last;
   return(result);
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...