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

 
GumRai:

Мы не знаем, что вы пытаетесь сделать.

Если вам нужна только одна открытая сделка за раз, проверьте, нет ли открытых ордеров перед отправкой нового.

Если вам нужна только одна сделка на бар, проверяйте только один раз на бар.

Если вам нужна комбинация условий, протестируйте комбинацию.

Я объясняю здесь:

У меня есть максимум 6 поддержек и 6 сопротивлений для каждого часа. Это может быть 2 поддержки и 2 сопротивления или что угодно, но максимум 6 поддержек и 6 сопротивлений для каждого часа.

Я хочу открыть лимитный ордер на этих уровнях S/R в начале каждого часа.

Я создал одну функцию покупки и одну функцию продажи... так что мне не нужно записывать один и тот же код покупки/продажи для 12 уровней S/R.

Теперь. когда я использую следующий код:

int SellCall(double SC)
{
   SellStopLoss = SC + (StopLoss * CalcPoint1);
   SellTakeProfit = SC - (TakeProfit * CalcPoint1);
   SellTicket = OrderSend(Symbol(),OP_SELLLIMIT,LotSize,SC,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Limit Order",MagicNumber,TimeCurrent()+3540,Red);

   return(0);
}

Он создает несколько одинаковых ордеров:

Я такжеиспользовал кодWHRoeder. В отдельной функции. Так как я не могу объявить функцию внутри функции.

 

Ваша проблема не в функции, которую вы опубликовали, проблема в коде, который вызывает функцию.

Очевидно, что нет проверки, были ли заказы уже размещены.

 
GumRai:

Ваша проблема не в функции, которую вы опубликовали, проблема в коде, который вызывает функцию.

Очевидно, что нет проверки на то, что заказы уже были размещены

код для вызова функции (снимок)

 if(FS == 1 || FS == 5 || FS == 7)
   {
     if( P1 == 1 || P1 ==5 || P1 ==7)
      {
      
      BuyCall(S0);
      }    
     if( P2 == 1 || P2 ==5 || P2 ==7)
      {
      
      BuyCall(S1);
      }  
     if( P3 == 1 || P3 ==5 || P3 ==7)
      {
  
      BuyCall(S2);
      }  
     if( P4 == 1 || P4 ==5 || P4 ==7)
      {
      
      BuyCall(S3);
      }      
          
     if( P5 == 1 || P5 ==5 || P5 ==7)
      {
     
      BuyCall(S4);
      }      
     if( P6 == 1 || P6 ==5 || P6 ==7)
      {
     
      BuyCall(S5);
      }  
     if( P7 == 1 || P7 ==5 || P7 ==7)
      {
      
      SellCall(R0);
      } 
     
      if( P8 == 1 || P8==5 || P8 ==7)
      {
    
      SellCall(R1);
      }  
      
     if( P9 == 1 || P9==5 || P9 ==7)
      {
      
      SellCall(R2);
      }          
          
    if( P10 == 1 || P10==5 || P10 ==7)
      {
     
      SellCall(R3);
      }   
    if( P11 == 1 || P11==5 || P11 ==7)
      {
     
      SellCall(R4);
      }                       
    if( P12 == 1 || P12==5 || P12 ==7)
      {
       
      SellCall(R5);
      }            
          
    }
   

Как проверить, что заказы уже были размещены или нет? С условиями buyticket > 0?

 
cashcube:

код для вызова функции (снимок)

Как проверить, что заказы уже были размещены или нет? С условиями buyticket > 0?

Трудно дать совет, поскольку я не знаю, что вы делаете в конце часа с незапущенными ордерами и как вы управляете запущенными ордерами.

Вы можете создать глобально объявленный массив (или 2) и хранить в нем номера билетов для открытых ордеров. Перед открытием нового ордера проверьте элемент массива, соответствующий уровню, на значение >0.

Конечно, вам также нужно будет проверить номера билетов и, если вы удаляете несработавшие ордера, установить элемент массива в 0. Вам также может понадобиться проверить, закрылся ли ордер, и, в зависимости от вашей логики, снова установить его в 0.

 
GumRai:

Трудно дать совет, поскольку я не знаю, что вы делаете в конце часа с незапущенными ордерами и как вы управляете запущенными ордерами.

Вы можете создать глобально объявленный массив (или 2) и хранить в нем номера билетов для открытых ордеров. Перед открытием нового ордера проверьте элемент массива, соответствующий уровню, на значение >0.

Конечно, вам также нужно будет проверить номера билетов и, если вы удаляете не сработавшие ордера, установить элемент массива в 0. Вам также может понадобиться проверить, закрылся ли ордер, и, в зависимости от вашей логики, снова установить его в 0.

Поскольку я устанавливаю уровни экспирации для нетриггерных ордеров, они истекают в 0:59 или на 59-й минуте. Для триггерных ордеров устанавливаются SL и TP.

Ранее я разработал Ea, который принимает один ордер на покупку или продажу в течение каждого часа. Но здесь это кажется очень сложным.

Хорошо, я попробую закодировать его, как вы сказали. Если возникнут проблемы, я напишу здесь. Кроме того, было бы хорошо, если бы вы могли поделиться каким-нибудь простым примером кода для подсчета количества билетов.

Спасибо за ваше предложение.

 

Я временно решил свою проблему с помощью следующего кода и запустил его на часовом графике. Простой

 //--- go trading only for first tiks of new bar
   if(Volume[0]>1) return(0);
 
Бары ненадежны (обновление/переподключение может изменить количество баров на графике) Объем ненадежен (пропустить тики) Всегда используйте время. Новая свеча - Форум MQL4
 
WHRoeder:
Бары ненадежны (обновление/подключение может изменить количество баров на графике) Объем ненадежен (пропустить тики) Всегда используйте время. Новая свеча - Форум MQL4

Спасибо за код. Я добавил его в функцию Tick. Но теперь мой советник не принимает никаких сделок. Поскольку я использую функцию buycall/sell call для размещения отложенных ордеров. Я не смог добавить эту функцию внутри функции.

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


int SellCall(double SC)
{ 
   SellStopLoss = SC + (StopLoss * CalcPoint1);
   SellTakeProfit = SC - (TakeProfit * CalcPoint1);
   SellTicket = OrderSend(Symbol(),OP_SELLLIMIT,LotSize,SC,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Limit Order",MagicNumber,TimeCurrent()+3540,Red);

   return(0);
}
       
//+------------------------------------------------------------------+
//| OnTick function                                                  |
//+------------------------------------------------------------------+
void OnTick(){
   static datetime timeCur; datetime timePre = timeCur; timeCur=Time[0];
   bool isNewBar = timeCur != timePre;
   if(isNewBar){ 
     return; // Once per bar
   }
   return; // every tick
}  

Есть идеи?

 

Кроме того, обратная торговля по остановленным ордерам также не работает.

//-------------Reverse trade for buy
     for(xx =OrdersHistoryTotal()-1;xx >=0;xx --)
     {
         if(OrderSelect(xx, SELECT_BY_POS,MODE_HISTORY))
         {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()== MagicNumber)
           {
          //for buy order reverse
          if(OrderType()==OP_BUY && OrderProfit()<0) // if last buy closed with loss
          { 
            //--- go trading only for first tiks of new bar
            if(Volume[0]>1) return(0);
            SellStopLoss = Bid + (StopLoss * CalcPoint1);
            SellTakeProfit = Bid - (TakeProfit * CalcPoint1);
            SellTicket = OrderSend(Symbol(),OP_SELL,LotSize,Bid,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Reverse Order",MagicNumber,0,Red);
          }
         break; 
          }
          }
     } 
 

Есть ли какие-нибудь рекомендации по обратному коду? Почему он не работает?

Спасибо.