Советник закрывает сделки, когда он увеличит Эквити на n долларов. Как реализовать, если в соседнем окне работает другой советник. Советник должен учитывать только свое увеличение эквити. - страница 4

 

У меня есть одна привычка, такая особенная и я тем более рассеянный, привычка не дочитывать все до конца, то есть, эта привычка оптимиста, желания которого, говорят ему, что стакан на половину полон, и можно идти дальше. Но иногда она помогает, и именно в предвидении ситуации, то есть, забегать на перед. И она же говорит, о том, что у меня математический склад ума, а рассеянность, говорит, о том, что я думаю образно, то есть, широко. А вот в мелочах допускаю ошибки, так как они уже не интересны. А вот программирование меня сильно выручает по поводу концентрации идеи в нужном направлении. А разбираться с побитовыми операциями надо учиться, все программисты в своих кодах используют побитовую систему, и если ты видишь набор цифр, то там обычные условия, это своего рода скачек, через незнающих - к знающим. Для полного контроля напиши в Init()  и присвой времени этот магический номер с каким в последствии будешь работать, там как запустится робот на исполнение, это время будет будет присвоено только этому магику и что с ним будет происходить дальше по коду, будет происходить только с ним. Удачи.

 

Лично я Init() в обще стараюсь не использовать, если только какие данные нужны в журнале, о брокере и все. Напиши функцию пользовательскую простенькую и пользуйся ей всегда и все.

 

а зачем забивать в глобальную переменную если можно сделать функцию и 1 раз запускать ее при запуске советника

 

И опять я не пойму, а зачем Вам все это на третей странице здесь указано Init() и DeInit(), для чего Вам нужен какой-то код? Допустим, Вы запускаете один и тот же советник на двух валютных парах EUR/USD и GBP/USD, что надо сделать, прежде чем два советника работали каждый по своему. Это изменить в настройках одному советнику магик и все. У одного он будет №1, а у другого №2 и все, и не надо ни чего выдумывать лишнего. Функция инит больше предназначена для написания графических объектов, и деинит убирает их с графика и все. Инит выводит на график, деинит убирает с графика. Не лезьте туда совсем. Если Ваш робот не рисует что-либо на графике, то и делать там нечего. Забудьте об этих функциях совсем. Все происходит в функции OnTick(), все что Вам нужно должно быть здесь, если Вы создали пользовательскую функцию, то для ее работы надо объявить ее в функции OnTick(), если Вы ее объявите в OnInit(), то она отработав один раз и уйдет, как медведь в спячку, и Вам придется постоянно компилировать свой код, что бы она работала. Сложно, но бывает. Сложно постоянно писать и везде OrderMagicNumber(), бывает, а без функции OrderSelect() фактически ни чего сделать с ордерами нельзя. Так что увы, но есть указание с верху, писать и составлять код так - как мы его Вам указали, иначе компиляции не подлежит, или подлежит, но происходить ни чего не будет. Так что ОрдерСелект надо писать везде, где касается ордеров.

 

Давайте пройдем в школьную программу.

int a = 3;

int b =5;

if(Ask>MovingAverage){ a=a+b;}

И вот, пока условия не будут истина "а" будет равняться трем. То есть если Ask гуляет ниже MovingAverage, то и "а" равно трем, как только Ask будет больше MovingAverage, условия встанут истинными и исполнится код прописанный в фигурных скобках, произойдет сложение чисел и переменной "а" будет присвоено число восемь. В функции OnTick() происходит все с каждым тиком. Произошел еще один тик, опять начинается проверка, а=3 - хорошо, b=5 - хорошо, if(Ask>MovingAverage) - больше - хорошо, а=8 - хорошо. Через какое-то время Ask опустилась ниже MovingAverage, пошел еще один тик, какому числу будет равно "a"? Но если Вы в OnInit(), присвоите int а=3; а в OnTick() напишете int b=5; if(Ask>MovingAverage), то а всегда будет принимать новое значение, так как к ней всегда будет прибавляться b, своего рода будет создан цикл. А Вам это надо?! В функции OnInit() используется только то, что должно произойти один раз при запуске программы.  И все. А вот если Вы хотите, что бы число постоянно менялось, то 8, то 3, то надо немного дописать: if(Ask>MovingAverage){a=b+a;}else{a=3;}. Удачи ребят, и проверяйте все задумки в журнале Print(" ");. и просматривайте его. Alert быстрый и не лично не для меня, я пользуюсь журналом, все идеи вначале вывожу в журнал. Как-то так?!

 
Mickey Moose:

а зачем забивать в глобальную переменную если можно сделать функцию и 1 раз запускать ее при запуске советника

Подожди, не мешай человеку выплёскивать свои знания наружу, они его распирают. Не дай Бог лопнет...

 
Юра куксов:

Допустим, Вы запускаете один и тот же советник на двух валютных парах EUR/USD и GBP/USD, что надо сделать, прежде чем два советника работали каждый по своему. Это изменить в настройках одному советнику магик и все. У одного он будет №1, а у другого №2 и все, и не надо ни чего выдумывать лишнего.

А с одним магиком но проверить Symbol ордера, разве нельзя работать?

class CMyTrade
{
public:
     CMyTrade(){};
     ~CMyTrade(){};
#ifdef __MQL5__
     int       Orders_Total()      { return( PositionsTotal() ); }
     string    Order_Symbol()      { return( PositionGetString(POSITION_SYMBOL) ); }
     int       Order_Type()        { return( (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE) ); }
     int       Order_MagicNumber() { return( (int)PositionGetInteger(POSITION_MAGIC) ); }
     bool      Order_Select(const int cnt){ return( PositionSelect( PositionGetSymbol(cnt) ) ); }
#else
     int       Orders_Total()      { return( OrdersTotal() ); }
     string    Order_Symbol()      { return( OrderSymbol() ); }
     int       Order_Type()        { return( OrderType() ); }
     int       Order_MagicNumber() { return( OrderMagicNumber() ); }
     bool      Order_Select(const int cnt){ return( OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES) ); }
#endif
};
CMyTrade trade;

//+------------------------------------------------------------------+
void OnTick()
{
     for(int cnt=0; cnt<trade.Orders_Total(); cnt++)
     {
          if( !trade.Order_Select(cnt) ) continue;
          if( trade.Order_Type()!= ORDER_TYPE_BUY && trade.Order_Type()!= ORDER_TYPE_SELL ) continue;
          if( trade.Order_MagicNumber() != 100 ) continue;
          if( trade.Order_Symbol() != Symbol() ) continue;
                    
          switch( trade.Order_Type() )
          {
               case ORDER_TYPE_BUY:
                    /// .....
                    break;
               case ORDER_TYPE_SELL:
                    /// .....
                    break;
          }
     }
     
     return;
}
//+------------------------------------------------------------------+
Причина обращения: