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

 
Wodzuuu:

Вопрос 1. Должен ли я использовать MyPips в свече, в этой функции? bool BULL4()

Да. Однако, корректен ли оператор if в функции BULL4()? Я имею в виду, ищете ли вы ту свечу, которую вычисляете?

Wodzuuu:

И Я ПРОГРАММИРОВАЛ ПРОГРАММУ для меня это хорошо :) а как насчет Вас?

Это ваше, так что это должно быть хорошо для вас, а не для меня.

Некоторые комментарии:

bool CheckForCloseBULL4()
{
   int i;
   for(i=OrdersTotal()-1;i>=0;i--)
      if( ! OrderSelect(i, SELECT_BY_POS, MODE_TRADES) ) continue;
         if( OrderMagicNumber() == MAGICMA1 && OrderSymbol() == Symbol()  && OrderType() == OP_BUY )
            if(OrderOpenPrice()+8*MyPips < Ask) return(true);
            
   else return(false);   // <-- the else here is wrong. Use {} if you are unsure what is processed where
}


int OpenOrders_BULL4(string symbol)
  {
   int buys=0;

   for(int i=0;i<OrdersTotal();i++)   // <-- do it like you do it in the other loops!
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;  // <-- break? Why not using always the same code for the same thing? 
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA1) //     Look at the for loop you used in CheckForCloseBULL4().       
        {
         if(OrderType()==OP_BUY) buys++; // <-- why this additional if? Simplify it to: 
        }                                //     if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA1 && OrderType()==OP_BUY) buys++;  
     }
   return(buys);
  }
 

Я исправляю последние ошибки

bool CheckForCloseBULL41()
{
   int i;
   for(i=OrdersTotal()-1;i>=0;i--)
      if( ! OrderSelect(i, SELECT_BY_POS, MODE_TRADES) ) continue;
         if( OrderMagicNumber() == MAGICMA1 && OrderSymbol() == Symbol()  && OrderType() == OP_BUY )
            if(OrderOpenPrice()+8*MyPips < Ask) return(true);
            else return(false);                                                                              // <-- the else is correct now
}

int OpenOrders_BULL4(string symbol)
  {
   int buys=0;
   int i;
   for(i=OrdersTotal()-1;i>=0;i--)                                                                     // Loop is correct and use the same code
     {
      if( ! OrderSelect(i, SELECT_BY_POS, MODE_TRADES) ) continue;
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA1 && OrderType()==OP_BUY)buys++;
     }
   return(buys);
  }

Добавляю вторую покупку

условие для открытия:

bool BULL42send()
   {
   int i;
   for(i=OrdersTotal()-1;i>=0;i--)
      if( ! OrderSelect(i, SELECT_BY_POS, MODE_TRADES) ) continue;
         if( OrderMagicNumber() == MAGICMA1 && OrderSymbol() == Symbol()  && OrderType() == OP_BUY )
            if(OrderOpenPrice()+8*MyPips < Ask) return(true);
      else return(false);
   }

Open и CheckForClose и Close тот же код, что и для BULL41 (только с разницей в пипсах).

Стартовая функция выглядит так:

void start()
  {
   if(BULL4() && BULL41send() && OpenOrders_BULL4(Symbol())==0)             
     {
       OpenBULL41();//do open buy position
     }
   if(BULL42send() && OpenOrders_BULL4(Symbol())==1)             
     {
       OpenBULL42();//do open buy position
     }     
     

   if(CheckForCloseBULL41()==true && OpenOrders_BULL4(Symbol())==1) CloseBULL4();
   if(CheckForCloseBULL42()==true && OpenOrders_BULL4(Symbol())==2) CloseBULL4();      
  }
//+------------------------------------------------------------------+

И теперь мне нужен флаг, сброс сигналов и изменение функции запуска.

Мое воображение говорит:

Новый бар:

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;
      }
   }

и старт выглядит так

void start()
  {
   bool SignalBULL41Executed=false;
   bool SignalBULL42Executed=false;
   
   if(Fun_New_Bar()==true)
      {
      SignalBULL41Executed=false;
      SignalBULL42Executed=false;
      }   
   
   if(BULL4() && BULL41send() && !SignalBULL41Executed && OpenOrders_BULL4(Symbol())==0)             
     {
       OpenBULL41();//do open buy position
       SignalBULL41Executed=true;
     }
   if(BULL42send() &&  !SignalBULL42Executed && OpenOrders_BULL4(Symbol())==1)             
     {
       OpenBULL42();//do open buy position
       SignalBULL42Executed=true;
     }     
     

   if(CheckForCloseBULL41()==true && OpenOrders_BULL4(Symbol())==1) CloseBULL4();
   if(CheckForCloseBULL42()==true && OpenOrders_BULL4(Symbol())==2) CloseBULL4();      
  }

Код работает, но, возможно, у меня есть некоторые ошибки


	          
 

Мне не хватает функции ResetSignals(), поэтому она не работает хорошо

 
Wodzuuu:

Я исправляю последние ошибки
...
...
...

Код работает, но возможно у меня есть некоторые ошибки


Я не сказал, что в функции CheckForCloseBULL41() else неверно, потому что она была некрасиво сформулирована. Вы ничего не изменили. Если более одного из открытых ордеров совпадают с нижеуказанными, у вас возникнут проблемы, так как цикл не проходит по всем ордерам.

if( OrderMagicNumber() == MAGICMA1 && OrderSymbol() == Symbol()  && OrderType() == OP_BUY )

Вам не нужны сигнальные флаги до тех пор, пока вы открываете новые ордера только на определенном количестве уже открытых ордеров. Это также не позволит коду открывать больше ордеров.

if(BULL4() && BULL41send() && !SignalBULL41Executed && OpenOrders_BULL4(Symbol())==0)

Ваша функция Fun_New_Bar() некорректна.

 

1. другая проблема

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

bool CheckForCloseBULL41()
{
   int i;
   for(i=OrdersTotal()-1;i>=0;i--)
   {
      if( ! OrderSelect(i, SELECT_BY_POS, MODE_TRADES) ) continue;
        {
         if( OrderMagicNumber() == MAGICMA1 && OrderSymbol() == Symbol() && OrderType() == OP_BUY )
            {
            if(OrderOpenPrice()+8*MyPips < Ask)
               {
                  return(true);
               }
            }
         }
    }    
   return(false); 
}

2. проблема нового бара

bool Fun_New_Bar()                
   {                                
   static datetime New_Time=0;      
                     
   if(New_Time!=Time[0])           
      {
      New_Time=Time[0];                
      return(true);            
      }

   return(false);
   }

3. проблема с сигналом сброса

void start()
  {
   bool SignalBULL41Executed;
   bool SignalBULL42Executed;
   
   if(Fun_New_Bar()==true)
      {
      SignalBULL41Executed=false;
      SignalBULL42Executed=false;
      }   
   
   if(BULL4() && BULL41send() && !SignalBULL41Executed && OpenOrders_BULL4(Symbol())==0)             
     {
       OpenBULL41();//do open buy position
       SignalBULL41Executed=true;
     }
   if(BULL42send() &&  !SignalBULL42Executed && OpenOrders_BULL4(Symbol())==1)             
     {
       OpenBULL42();//do open buy position
       SignalBULL42Executed=true;
     }     
     

   if(CheckForCloseBULL41()==true && OpenOrders_BULL4(Symbol())==1) CloseBULL4();
   if(CheckForCloseBULL42()==true && OpenOrders_BULL4(Symbol())==2) CloseBULL4();      
  }

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

 

1. другая проблема
Исправлено

2. Проблема с новым баром
Исправлено

3. проблема с сигналом сброса

void start()
  {
   bool SignalBULL41Executed;  //<-- if defined inside the start function, the flags get reset with every tick.
   bool SignalBULL42Executed;  //    define it outside in global scope.
   
   if(Fun_New_Bar()==true)
      {
      SignalBULL41Executed=false;
      SignalBULL42Executed=false;
      }   
   
   if(BULL4() && BULL41send() && !SignalBULL41Executed && OpenOrders_BULL4(Symbol())==0)             
     {
       OpenBULL41();//do open buy position   //<-- As far as I remember, you defined this as bool. Do only set the flag, if the function returns true.
       SignalBULL41Executed=true;            //    change to: if(OpenBULL41())SignalBULL41Executed=true;
     }
Приведенные выше исправления относятся к флагам. Но вопрос остается открытым - нужно ли вам это? Если вы открываете только новый ордер, если уже открыто определенное количество ордеров, то, скорее всего, он вам не нужен. Вот что я имел в виду, говоря о выражении, отмеченном желтым цветом:
if(BULL4() && BULL41send() && !SignalBULL41Executed && OpenOrders_BULL4(Symbol())==0)

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

 

Я думаю, что флаг не обязателен, но может быть полезен когда-нибудь.

Как иметь два советникав одном советнике?
Я сделал копии советника BULL4 и изменил идекс BULL6 и спейс пипсов.
Скопируйте советник Bull4 + советник Bull6 в новый советник (все после цифры ()). Сделайте изменения в функции start () и magicma2...

Мой советник работает очень хорошо, сценарии не мешают друг другу . Я счастлив.

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

Тема, на мой взгляд, закончена.

С уважением,

 
Wodzuuu:

Мой советник работает очень хорошо, сценарии не мешают друг другу . Я счастлив.

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

Не за что. Спасибо за приятный отзыв.