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

 
GumRai:

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

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

Спасибо GumRai за быстрый ответ. В моей программе много условий, как показано ниже. Я проверил до P12. Это как поворотный пункт. Если условия удовлетворяются, тогда он открывает лимитные сделки на этих уровнях P1, P2, ....as его номер 12. Я не хотел писать код покупки/продажи для каждого случая. Поэтому сделал отдельные функции buycall/sellcall. Ниже приведен мой старый код для продажи.

     if( P1 == 1 || P1 ==5 || P1 ==7)
      {
      if ( BuyTicket == 0)
      BuyCall(S0);
      }    
     if( P2 == 1 || P2 ==5 || P2 ==7)
      {
      if ( BuyTicket == 0)
      BuyCall(S1);
      }  
         .......................many more
 
int SellCall(double SC)
{

if(!OrderSelect(SellTicket, SELECT_BY_TICKET))
  {    
  if( SellTicket == 0)
   {
   SellStopLoss = SC + (StopLoss * CalcPoint1);
   SellTakeProfit = SC - (TakeProfit * CalcPoint1);
   SellTicket = OrderSend(Symbol(),OP_SELLLIMIT,LotSize,SC,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Limit Order",MagicNumber,expiration,Red);
   BuyTicket = 0; 
   // counter tradee //
   if ( Ask > SellStopLoss && BuyTicket == 0)
   {   if(!OrderSelect(BuyTicket, SELECT_BY_TICKET))
       {
       BuyStopLoss = Ask - (StopLoss * CalcPoint1);
       BuyTakeProfit = Ask + (TakeProfit *  CalcPoint1);
       BuyTicket = OrderSend(Symbol(),OP_BUY,LotSize,Ask,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy Order",MagicNumber,0,Green);
       SellTicket = 0;
       }
   }
  } 
 }
   return(SellTicket);
}
 

Вот пример. Одна и та же сделка размещается на каждом тике. Мне нужно разместить это на каждый час. Поскольку это часовой разворот.

 
int SellCall(double SC)
{

if(!OrderSelect(SellTicket, SELECT_BY_TICKET))
  {    
  if( SellTicket == 0)
   {
   SellStopLoss = SC + (StopLoss * CalcPoint1);
   SellTakeProfit = SC - (TakeProfit * CalcPoint1);
   SellTicket = OrderSend(Symbol(),OP_SELLLIMIT,LotSize,SC,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Limit Order",MagicNumber,expiration,Red);
   BuyTicket = 0; 
   // counter tradee //
   if ( Ask > SellStopLoss && BuyTicket == 0)
   {   if(!OrderSelect(BuyTicket, SELECT_BY_TICKET))
       {
       BuyStopLoss = Ask - (StopLoss * CalcPoint1);
       BuyTakeProfit = Ask + (TakeProfit *  CalcPoint1);
       BuyTicket = OrderSend(Symbol(),OP_BUY,LotSize,Ask,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy Order",MagicNumber,0,Green);
       SellTicket = 0;
       }
   }
  } 
 }
   return(SellTicket);
}

Когда вы открываете лимит на продажу, вы устанавливаете BuyTicket в 0.

Затем вы проверяете, установлен ли BuyTicket==0, конечно, да, вы только что его установили.

Затем вы устанавливаете SellTicket на 0.

Следующий тик, Sellticket==0, поэтому вы открываете лимит на продажу и снова устанавливаете BuyTicket на 0.

и так далее и так далее............

 
GumRai:

Когда вы открываете лимит на продажу, вы устанавливаете BuyTicket в 0.

Затем вы проверяете, установлен ли BuyTicket==0, конечно, да, вы только что его установили.

Затем вы устанавливаете SellTicket на 0.

Следующий тик, Sellticket==0, поэтому вы открываете лимит на продажу и снова устанавливаете BuyTicket на 0.

и так далее и так далее............

Тогда я должен удалить эти две строки, которые вы выделили. Я так и сделал. Теперь показываю только результат одного часа за 2 месяца тестирования данных.

Еще одна вещь, которую я заметил, в моем sellcall, у меня есть обратная сделка на покупку. Если сделка sell будет остановлена, тогда откроется сделка buy. Теперь для функции sellcall она возвращает(Selltickets), так что все в порядке?

Спасибо.

 

int SellCall(double SC)
{

if(!OrderSelect(SellTicket, SELECT_BY_TICKET))
  {    
   if( SellTicket == 0)
   {
   SellStopLoss = SC + (StopLoss * CalcPoint1);
   SellTakeProfit = SC - (TakeProfit * CalcPoint1);
   SellTicket = OrderSend(Symbol(),OP_SELLLIMIT,LotSize,SC,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Limit Order",MagicNumber,0,Red);
   
   // reverse tradee //
   if ( Ask > SellStopLoss && BuyTicket == 0)
   {   if(!OrderSelect(BuyTicket, SELECT_BY_TICKET))
       {
       BuyStopLoss = Ask - (StopLoss * CalcPoint1);
       BuyTakeProfit = Ask + (TakeProfit *  CalcPoint1);
       BuyTicket = OrderSend(Symbol(),OP_BUY,LotSize,Ask,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy Order",MagicNumber,0,Green);
       
       }
   }
 } 
 }
   return(SellTicket);

Теперь я понимаю, что в этом коде, сначала проверяется sellticket == 0 да очевидно, затем размещается ордер на продажу, затем buyticket == 0 да, затем размещается ордер на покупку...но когда возвращается...снова проверяется sellticket == 0, нет его сейчас нет...так вот почему Ea остановился после взятия одного сета. Но как устранить эту проблему. В моем советнике неактивные отложенные ордера удаляются через каждые 59 минут от начального часа. Я настроил это таким образом.

 

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

У меня есть максимум 6 поддержек и 6 сопротивлений на час. Если 6 из них удовлетворяют условиям, то он открывает лимитные ордера на эти 6. Если 1 удовлетворяет, то открывает лимитные ордера на него. Это и есть алгоритм.

Поэтому я настроил код следующим образом для вызова функции.

int BuyCall( double BC)
{  
      
if ( BuyTicket >= 0 && BuyTicket <= 5)
  {
   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)
{
  
 if( SellTicket >= 0 && SellTicket <= 5)
   {
   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);
}

Теперь он работает в течение часа и проверяет 6 уровней для каждой покупки/продажи. Но работает только час. Что нужно сделать, чтобы он работал идеально для полного набора данных.

 
if ( BuyTicket >= 0 && BuyTicket <= 5)

Это будет работать только в тестере стратегий и больше ничего не сделает после открытия первых 6 ордеров.

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

 
GumRai:

Это будет работать только в тестере стратегий и больше ничего не сделает после открытия первых 6 ордеров.

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

Спасибо за ваш ответ.

Тогда что мне делать. Если я удалю BuyTicket =>0 или любые условия BuyTicket. Тогда советник совершает много одинаковых сделок с каждым тиком.....Давая мне ошибку отправки ордеров 148.

 
cashcube: Тогда что мне делать.
Предыдущий ответ.
 
cashcube:

Спасибо за ваш ответ.

Тогда что мне делать. Если я удалю BuyTicket =>0 или любые условия BuyTicket. Тогда советник совершает много одинаковых сделок с каждым тиком.....Давая мне ошибку отправки ордеров 148.

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

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

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

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