Ea создает несколько одинаковых отложенных/лимитных ордеров [Help pls].

 

Здравствуйте, я создал Ea, но когда я делаю обратное тестирование, он создает много одинаковых отложенных ордеров на каждом тике. Как это остановить. Мне нужен только один ордер за раз, мне не нужны его копии.

Если я запускаю этот советник на часовом графике с"только ценой открытия", то он не создает копий.

Плюс у моего советника есть опция для разворотной торговли, если лимит покупки не достигается, то он открывает сделку на продажу. Пожалуйста, сообщите мне, что я настроил правильно или нет. Любая помощь будет оценена по достоинству.

Спасибо за ваше время.

// Main function//
if(condition)
   {
     if( condition )
      {
      if ( BuyTicket == 0)
      BuyCall(S0);
      }    
     if( condition)
      {
      if ( BuyTicket == 0)
      BuyCall(S1);
      }  

   etc etc... // many conditions
}

//---------------------- Buy/Sell function (limit orders)
int BuyCall( double BC)
{  
   if ( BuyTicket == 0)
   {
   BuyStopLoss = BC - (StopLoss * CalcPoint1);
   BuyTakeProfit = BC + (TakeProfit *  CalcPoint1);
   BuyTicket = OrderSend(Symbol(),OP_BUYLIMIT,LotSize,BC,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy limit Order",MagicNumber,expiration,Green);
   SellTicket = 0;

   // reverse trade//
     if( Bid < BuyStopLoss && SellTicket == 0 )
     {  
        SellStopLoss = Bid + (StopLoss * CalcPoint1);
        SellTakeProfit = Bid - (TakeProfit * CalcPoint1);
        SellTicket = OrderSend(Symbol(),OP_SELL,LotSize,Bid,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Order",MagicNumber,0,Red);
        BuyTicket = 0;
     }    
   }
      
return(BuyTicket);
}
 
cashcube: Как это остановить.
Как вы думаете? Перед открытием нового проверяется уже вышедший.
 
WHRoeder:
денежный куб : Как остановить это.
Как вы думаете? Перед открытием нового проверяете уже вышедший.

Тогда что делать? Убрать код buyticket == 0 & sellticket == 0?
 
Советники должны быть закодированы для восстановления. Если отключится электричество, произойдет сбой ОС, терминал или график будут случайно закрыты, на следующем тике все статические/глобальные переменные тикета будут потеряны. У вас будет открытый ордер, но вы не будете знать об этом, поэтому советник никогда не попытается закрыть его, отследить SL и т.д. Как вы собираетесь восстанавливаться? Используйте циклOrderSelect для восстановления, или требуется постоянное хранение (GV/файл) номеров тикетов.
 
WHRoeder:
Советник должен быть закодирован для восстановления. Если отключится электричество, произойдет сбой ОС, терминал или график будет случайно закрыт, на следующем тике все статические/глобальные переменные тикетов будут потеряны. У вас будет открытый ордер, но вы не будете знать об этом, поэтому советник никогда не попытается закрыть его, отследить SL и т.д. Как вы собираетесь восстанавливаться? Используйте циклOrderSelect для восстановления, или требуется постоянное хранение (GV/файл) номеров тикетов.

Здравствуйте, я добавил его, изменив код следующим образом.

//---------------------- Buy/Sell function (limit orders)
int BuyCall( double BC)
{  
  if(!OrderSelect(BuyTicket, SELECT_BY_TICKET)==true)
    {      
  if ( BuyTicket == 0)
  {
   BuyStopLoss = BC - (StopLoss * CalcPoint1);
   BuyTakeProfit = BC + (TakeProfit *  CalcPoint1);
   BuyTicket = OrderSend(Symbol(),OP_BUYLIMIT,LotSize,BC,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy limit Order",MagicNumber,expiration,Green);
   SellTicket = 0;
   // counter trade//
     if( Bid < BuyStopLoss && SellTicket == 0 )
     {  
        if(!OrderSelect(SellTicket, SELECT_BY_TICKET) == true)
        {
        SellStopLoss = Bid + (StopLoss * CalcPoint1);
        SellTakeProfit = Bid - (TakeProfit * CalcPoint1);
        SellTicket = OrderSend(Symbol(),OP_SELL,LotSize,Bid,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Order",MagicNumber,0,Red);
        BuyTicket = 0;
        }
     }    
  }
 }

Он все равно принимает одни и те же ордера несколько раз с каждым тиком.

Плюс, если я убираю знак "!", то он не принимает никаких сделок.

И последнее, нужно ли мне удалить проверку buyticket и sellticket из моей основной функции?

Спасибо.

 
if(!OrderSelect(BuyTicket, SELECT_BY_TICKET)==true)
  1. Не вставляйте код
    Воспроизвести видео
    Пожалуйста, отредактируйте ваше сообщение.
    Для больших объемов кода, прикрепите его.

  2. Вы бы никогда не написали if( (2+2 == 4) == true), не так ли? if(2+2 == 4) достаточно. Поэтому не пишите if(bool == true), используйте if(bool) или if(! bool). Код становится самодокументирующимся, когда вы используете осмысленные имена переменных, например bool isLongEnabled. Long_Entry звучит как цена срабатывания или номер билета, а "if long entry" - это неполное предложение.
  3. Где вы проверяете, закрылся ли BuyTicket? Выбор по билету всегда будет истинным (при наличии действительного номера билета), ордер может быть любым из отложенных, открытых, закрытых или удаленных.
  4. Вы полностью проигнорировали мое предложение о цикле OrderSelect.
 

Здравствуйте, WHReder, спасибо за ваш ответ.

Да, я добавил их в код SRC. Но он не отображался при редактировании.

Я удалил == true условия, как вы посоветовали.

Пожалуйста, не поймите меня неправильно, у меня есть слабые места в понимании этого цикла orderelect. Я не игнорировал. Я попробовал добавить его, но он слишком сложный, запуск показывает 16 ошибок и 2 предупреждения. Что такое MN.Count в этом коде?

// extern int     Magic.Number.Base          = ...
// int      magic.number.max;                   // Export to OpenOrder/MySelect
// string   market.pair;                        // Export to OpenOrder/MySelect
// int init(){
//    market.pair       = Symbol();
//    magic.number.max  = Magic.Number.Base + MN.COUNT - 1;

Насчет проверки закрытого билета. Я не проверял, потому что если текущая цена ниже buystoploss, то сделка на покупку закрывается, поэтому я открыл ордер на продажу.

 Bid < BuyStopLoss 

С уважением,

 

Я расположил код примерно так... Но теперь показывает 2 ошибки... "Myselect" и "MyOrdersTotal" могут быть очищены только в глобальной области видимости.

int BuyCall( double BC)
{  
//-----------code
bool MySelect(int iWhat, int eSelect, int ePool=MODE_TRADES){
   if(!OrderSelect(iWhat, eSelect, ePool) )  return (false);
   int      mn = OrderMagicNumber();
   if(mn < MNB1              )  return (false);
   if(mn > MNB2               )  return (false);
   if(OrderSymbol()      != Pair   )  return (false);
   if(ePool != MODE_HISTORY               )  return (true);
   return(OrderType() <= OP_SELL); 
                                   
                                   
}
int MyOrdersTotal(int op=-1, int ePool=MODE_TRADES){   #define  OP_ALL -1
   if(ePool == MODE_TRADES)            iPos = OrdersTotal()        - 1;
   else                                iPos = OrdersHistoryTotal() - 1;
   for(nOrders=0; iPos >= 0; iPos--) if(
      MySelect(iPos, SELECT_BY_POS, ePool)) if(
      op == OP_ALL || op == OrderType()
   )  nOrders++;
   return(nOrders);
}

  if(!OrderSelect(BuyTicket, SELECT_BY_TICKET))
    {      
  if ( BuyTicket == 0)
  {
   BuyStopLoss = BC - (StopLoss * CalcPoint1);
   BuyTakeProfit = BC + (TakeProfit *  CalcPoint1);
   BuyTicket = OrderSend(Symbol(),OP_BUYLIMIT,LotSize,BC,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy limit Order",MagicNumber,expiration,Green);
   SellTicket = 0;
   // counter trade//
     if( Bid < BuyStopLoss && SellTicket == 0 )
     {  
        if(!OrderSelect(SellTicket, SELECT_BY_TICKET))
        {
        SellStopLoss = Bid + (StopLoss * CalcPoint1);
        SellTakeProfit = Bid - (TakeProfit * CalcPoint1);
        SellTicket = OrderSend(Symbol(),OP_SELL,LotSize,Bid,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Order",MagicNumber,0,Red);
        BuyTicket = 0;
        }
     }    
  }
 }
      
return(BuyTicket);
}
 
Вы не можете объявить функцию внутри другой функции
 
GumRai:
Вы не можете объявить функцию внутри другой функции

Тогда как я могу это сделать. Я имею в виду, что у меня есть много условий, которые нужно проверять по отдельности, чтобы открыть ордер на покупку/продажу.

Вот почему я сделал функцию buycall/sellcall, чтобы упростить код.

Просто советник совершает так много одинаковых сделок. Не знаю, как это остановить.

 
GumRai:
Вы не можете объявить функцию внутри другой функции

cashcube:

Тогда как я могу это сделать. Я имею в виду, что у меня есть много условий, которые нужно проверять по отдельности, чтобы открыть ордер на покупку/продажу.

Вот почему я сделал функцию buycall/sellcall, чтобы упростить код.

Просто советник совершает так много одинаковых сделок. Не знаю, как это остановить.

Прежде всего, не пытайтесь объявлять функцию внутри другой функции.

Я не могу понять, что вы пытаетесь сделать, глядя на код, который вы разместили. Поэтому я не могу вам помочь.