ONLY CANDLE / BAR - Как каталогизировать или разделить свечи? - ПОЖАЛУЙСТА, ПОПРАВЬТЕ МЕНЯ! - страница 2

 
Wodzuuu:

Для тех, кто до сих пор не понял моего советника напишите рассказ: D хе-хе


Событие - свечи - имеет различные варианты покупки и продажи или закрытия.

Я больше понимаю, глядя на ваш код, чем читая то, что вы написали... ;-)
 

Вместо того, чтобы смотреть телешоу в качестве второй функции, вы должны подумать о том, чтобы прочитать и понять книгу. ;-)

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

//Pseudo code

if(NewBar) ResetSignals();                //Set all SignalxExecuted to false
if(SignalBuy1&&!SignalBuy1Executed&&OpenOrders()==1){
//do open buy position
  SignalBuy1Executed=true;                //Set Signal to exectued to prevent a reuse in the same bar
}

if(SignalBuy2&&!SignalBuy2Executed&&OpenOrders()==2){
//do open buy position
  SignalBuy2Executed=true;                //Set Signal to exectued to prevent a reuse in the same bar
}

SignalBuy1=CheckForOpenBull42();          //Check for Signal1 condition is true
SignalBuy2=CheckForOpenBull62();	  //Check for Signal2 condition is true	

if(OpenOrders()>0)CheckForClose();        //Check any order needs to be closed


//and so on.....

Почему бы вам пока не попробовать реализовать только один сигнал и сконцентрироваться на кодировании необходимых функций? Если у вас есть хороший код для одного сигнала, вероятно, будет легко реализовать другие сигналы, и многие функции уже будут там.

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

 

Kronin Да! Вы меня поняли :), много стратегий в одном советнике.
Мне нужно написать 150 стратегий и они должны ходить одновременно по одному и тому же графику, и запускать все стратегии одновременно. Когда я запущу 150 советников одновременно, мой компьютер взорвется - я так думаю.

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

Конечно, стратегии не могут мешать друг другу и когда запускается одна, вторая тоже может запускаться, и я могу иметь запущенную стратегию 1, и 3, и 5. и стратегию (1,3,5) запущенную в тот же момент.

Не буду больше писать сказки :)


Мой код неправильный - это известно, я пытался поместить две стратегии в один советник, код работает хорошо, но совокупность не работает.

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

 

Привет друзья, после долгой работы в коде и благодаря информации из Kronin код структурирован и работает.
Код представляет две стратегии в одном советнике


1.для маленькой свечи сценарий покупки отмечен синей стрелкой, есть два варианта для BUY
2. для средней свечи сценарийпокупки свечи отмечен красной стрелкой, есть три варианта для BUY
.

У меня тожеесть ситуация, когда 1 пункт = 1 пипсу, это удобно (решение проблемы - на потом)
Не использовать опции if (NewBar) ResetSignals (), потому что я думаю, что они не являются причиной ошибки

Если удалить функцию PART 2 в start() blue одна стратегия будет работать, и она работает нормально.
Если вы запустите код PART1 и PART2, содержащий две стратегии запуска, но они будут перекрываться. это ошибка

Не могли бы вы посмотреть Кронин

//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
#define MAGICMA  20050610

//+------------------------------------------------------------------+
//| Check NEW BAR     WORK AT BARS  M15                                 |
//+------------------------------------------------------------------+
/*

bool New_Bar = false;

bool Fun_New_Bar()                

   {                                
   static datetime New_Time=0;      
   New_Bar=false;                   
   if(New_Time!=Time[0])           
      {
      New_Time=Time[0];                
      New_Bar=true;                    
      }
   }
*/

//+------------------------------------------------------------------+
//| Calculate open positions    HOW MEANY OF THIS                    |
//+------------------------------------------------------------------+

int OpenOrders(string symbol)
  {
   int buys=0,sells=0;
//----
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; 
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
        {
         if(OrderType()==OP_BUY) buys++;
        }
     }
//---- return orders volume
   return(buys);
  }

//+------------------------------------------------------------------+
//| Calculate candle      These is condidion                         |
//+------------------------------------------------------------------+

// scenario 1 / EA 1  /  startegy 1 / blue

bool BULL4()
   {
   if(Close[1]-Open[1]>=4*Point && Close[1]-Open[1]<=5*Point)
   return(true);
   } 

// scenario 2 / EA 2  /  startegy 2 / red

bool BULL6()
   {
   if(Close[1]-Open[1]>=6*Point && Close[1]-Open[1]<=7*Point)
   return(true);
   }
      
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+

// Check for open for scenario 1 / EA 1  /  startegy 1 
 
bool OpenBULL41()
  {
   int    res;
   if(Bid==Close[1]+3*Point)  
     {
      res=OrderSend(Symbol(),OP_BUY,0.41,Ask,0,Close[1]-25*Point,0,"",MAGICMA,0,Blue);
      return (true);
     }
   return (false);  
  }
  
//----------------------------------- 
bool OpenBULL42()
  {
   int    res;
   if(Ask>OrderOpenPrice()+4*Point)  
     {
      res=OrderSend(Symbol(),OP_BUY,0.42,Ask,0,Close[1]-25*Point,0,"",MAGICMA,0,Blue);
      return;
     }
  }  
  
// Check for open for scenario 2 / EA 2  /  startegy 2
  
void OpenBULL61()
  {
   int    res;
   if(Bid==Close[1]+4*Point)  
     {
      res=OrderSend(Symbol(),OP_BUY,0.61,Ask,0,Close[1]-25*Point,0,"",MAGICMA,0,Red);
      return;
     }
  }
//-----------------------------------  
 
void OpenBULL62()
  {
   int    res;
   if(Ask>OrderOpenPrice()+2*Point)  
     {
      res=OrderSend(Symbol(),OP_BUY,0.62,Ask,0,Close[1]-25*Point,0,"",MAGICMA,0,Red);
      return;
     }
  }
  
//----------------------------------- 
void OpenBULL63()
  {
   int    res;
   if(Ask>OrderOpenPrice()+2*Point)  
     {
      res=OrderSend(Symbol(),OP_BUY,0.63,Ask,0,Close[1]-25*Point,0,"",MAGICMA,0,Red);
      return;
     }
  }
//+------------------------------------------------------------------+
//| Check for close order conditions                                 |
//+------------------------------------------------------------------+

void CheckForClose()
{
   RefreshRates();
   if(OrderOpenPrice()+4*Point< Ask)
   for (int i = OrdersTotal()-1; i >= 0;i--)       // I Have do -1 in "OrdersTotal()-1"
   {
      OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
      if (OrderSymbol() == Symbol()) 
      {
         bool ticket = true;
         if (OrderType() == OP_BUY) ticket = OrderClose(OrderTicket(),OrderLots(),Bid,1,Black);

      }
   }
} 
/*
void CheckForClose2()
{
   RefreshRates();
   if(OrderOpenPrice()+6*Point< Ask)
   for (int i = OrdersTotal(); i >= 0;i--)
   {
      OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
      if (OrderSymbol() == Symbol()) 
      {
         bool ticket = true;
         if (OrderType() == OP_BUY) ticket = OrderClose(OrderTicket(),OrderLots(),Bid,1,Black);

      }
   }
} 
*/
                                       
//+------------------------------------------------------------------+
//| Start function                                 |
//+------------------------------------------------------------------+
void start()
  {
      
//------------------                                                          PART1      
           bool SignalBULL41Executed=false;
            if(BULL4() && !SignalBULL41Executed && OpenOrders(Symbol())==0)
               {
               OpenBULL41();//do open buy position
               SignalBULL41Executed=true;
               }
               
            bool SignalBULL42Executed=false;
            if(!SignalBULL42Executed && OpenOrders(Symbol())==1)
               {
               OpenBULL42();//do open buy position
               SignalBULL42Executed=true;
               }  
               
            if(OpenOrders(Symbol())>0)CheckForClose();  
            
//------------------                                                          PART 2
            
            bool SignalBULL61Executed=false;
            if(BULL6() && !SignalBULL61Executed && OpenOrders(Symbol())==0)
               {
               OpenBULL61();//do open buy position
               SignalBULL61Executed=true;
               }
               
            bool SignalBULL62Executed=false;
            if(!SignalBULL62Executed && OpenOrders(Symbol())==1)
               {
               OpenBULL62();//do open buy position
               SignalBULL62Executed=true;
               }  
               
           bool SignalBULL63Executed=false;
            if(!SignalBULL63Executed && OpenOrders(Symbol())==2)
               {
               OpenBULL63();//do open buy position
               SignalBULL63Executed=true;
               }                
               
//            if(SignalBULL61Executed && OpenOrders(Symbol())>0)CheckForClose2();                    
            
  }
//+------------------------------------------------------------------+
 
Wodzuuu:

Не использовать опции if (NewBar) ResetSignals (), потому что я думаю, что они не являются причиной ошибки

То, как закодирована функция Fun_NewBar(), не позволит вам сделать это... вам нужно сделать это так, чтобы она имела тип bool и возвращала значение bool....

bool Fun_New_Bar()                
   {                                
   static datetime New_Time=0;      
                     
   if(New_Time!=Time[0])           
      {
      New_Time=Time[0];                
      return(true);       // <---- we have a new bar so the function returns true
      }

   return(false);
   }
 

Да вы правы возвращает bool и есть int (уже исправлено) я не видел раньше. Спасибо.
Но эту функцию я не использую, она в виде текста

Я не думаю, что это относится к функциям , которые разделяютдве пересекающиеся стратегии. Я не вижу взаимосвязи. Или может я ошибаюсь?

//Pseudo code

if(NewBar) ResetSignals();                //Set all SignalxExecuted to false
if(SignalBuy1&&!SignalBuy1Executed&&OpenOrders()==1){
//do open buy position
  SignalBuy1Executed=true;                //Set Signal to exectued to prevent a reuse in the same bar
}
 

Приятно видеть, что вы достигли некоторого прогресса, но до этого еще далеко :-)

Вам нужно исправить то, что RaptorUK указал выше. Сброс сигналов очень важен, иначе советник очень быстро останавливается при открытии новых сделок.
Ваша реализация неверна. Если вы сбрасываете SignalExecuted при каждом тике, это не имеет смысла. Может быть, он и не открывает больше сделок, потому что вы фильтруете и OpenOrders. Но, поскольку ваша стратегия позволяет иметь несколько открытых ордеров, я могу предположить, что вам также нужен алгоритм для закрытия ордеров, поэтому вам нужен сброс флага SignalExecuted на новом баре (в вашей реализации он бесполезен и не нужен).

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

if(BULL4()&&!BULL6(){             // <--- only strategy BULL4 is valid, we are looking at a 'small' bar.
  if(!SignalBULL41Executed && OpenOrders(Symbol())==0){
    OpenBULL41();//do open buy position
    SignalBULL41Executed=true;
  }
  if(!SignalBULL42Executed && OpenOrders(Symbol())==1){
    OpenBULL42();//do open buy position
    SignalBULL42Executed=true;
}
 

Следующие шаги:

// Check for open for scenario 1 / EA 1  /  startegy 1 
 
bool OpenBULL41()
  {
   int    res;
   if(Bid==Close[1]+3*Point)  					                       // <--- equal makes no sense here and you should not compare doubles for equality. 
                                                                                                  Read (again): https://www.mql5.com/en/forum/136997 
     {
      res=OrderSend(Symbol(),OP_BUY,0.41,Ask,0,Close[1]-25*Point,0,"",MAGICMA,0,Blue); // <--- what is your plan with res? You are aware, it does include the ticket 
                                                                                                  number or -1, aren't you?

      return (true);                                                                   // <--- Even if OrderSend() fails you return true.
     }
   return (false);  
  }
  
//----------------------------------- 
bool OpenBULL42()
  {
   int    res;
   if(Ask>OrderOpenPrice()+4*Point) 							// <--- OrderOpenPrice() from a somewhere selected order may or may not work here 
                                                                                                  (may because only one order is open), but it is not nice coded. 
     {
      res=OrderSend(Symbol(),OP_BUY,0.42,Ask,0,Close[1]-25*Point,0,"",MAGICMA,0,Blue);
      return;
     }
  }  

Функция CheckForClose() имеет практически те же проблемы и, кроме того, в ней нет фильтра для магического числа. Также здесь функция OrderOpenPrice(), выбранная из ордера на покупку, может привести к закрытию неправильного ордера (я не уверен, что это действительно работает).
Пожалуйста, прочитайте еще раз то, что написал Raptor на первой странице этой темы.

Из ваших сообщений и комментариев в коде у меня сложилось впечатление, что вы хотите знать, какой ордер принадлежит какой стратегии. Для этого вы можете определить второе магическое число для второй стратегии. Тогда будет проще закрывать ордера в соответствии со стратегией, по которой они были открыты.

 
kronin:

Следующие шаги:

Из ваших сообщений и комментариев в коде у меня сложилось впечатление, что вы хотите знать, какой ордер принадлежит какой стратегии. Для этого вы можете определить второе магическое число для второй стратегии. Тогда будет проще закрывать ордера в соответствии с той стратегией, по которой они были открыты.

Не проще ли запустить 2 разные стратегии в 2 отдельных советниках, каждый на своем графике?
 
RaptorUK:
Не проще ли запустить 2 разные стратегии в 2 отдельных советниках, каждый на своем графике?

Да, для 2, 3, 4, 5... согласен. Но по рассказам и этот :"Я должен написать 150 политик и они должны ходить одновременно на одном графике, и запускать все стратегии одновременно. Когда я запущу 150 советников одновременно, мой ПК взорвется - я так думаю."
Я думаю, он планирует запустить много стратегий в одном советнике....