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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
sliper13666
50
sliper13666  

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

sliper13666
50
sliper13666  

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

Mickey Moose
3434
Mickey Moose  

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

sliper13666
50
sliper13666  

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

sliper13666
50
sliper13666  

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

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 быстрый и не лично не для меня, я пользуюсь журналом, все идеи вначале вывожу в журнал. Как-то так?!

Alexey Viktorov
27578
Alexey Viktorov  
Mickey Moose:

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

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

Konstantin Nikitin
8397
Konstantin Nikitin  
Юра куксов:

Допустим, Вы запускаете один и тот же советник на двух валютных парах 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;
}
//+------------------------------------------------------------------+
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий