Советники: Master_MM_Droid - страница 7

 
CryFrost:
А если вечером отключать терминал, а утром снова его включать он будет подхватывать свои позиции? Или лучше пускай круглосуточно работает?

Будет.
 
А как определить time_shift для своего города? Или лучше его не трогать?
 
CryFrost:
А как определить time_shift для своего города? Или лучше его не трогать?

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

Выложил код с устраненным багом. Модератор проверит и тогда появится для скачивания. Там буквально пара строчек. Всего ничего, вернул вырезанный явный вызов OpderSelect() перед OrderOpenPrice() в блоке RSI, видимо какая-то фигня со стеком вызываемых функций в терминале, или так и задумано, но в случае вызова OpderSelect() в пользовательской функции, его результат затирается при возврате функции. Если в одной функции вызван OpderSelect(), это не гарантирует, что после возврата в место вызова, OrderOpenPrice() отработает корректно. Так как у меня OpderSelect() вызывается при подсчете ордеров перед проверкой торговых условий, я посчитал явный вызов излишним и вырезал. Именно поэтому не сравнивалась цена. Для тех, кто не хочет ждать, вот код:

case rsi_magic:
//-----------------------          
     double open_price = 0;
     double r1 = iRSI(NULL,0,14,PRICE_CLOSE,1);
     double r2 = iRSI(NULL,0,14,PRICE_CLOSE,2);
     for (int t = 0; t < OrdersTotal(); t++) 
      {
      OrderSelect(t, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() == symbol && OrderMagicNumber() == rsi_magic)
      open_price = OrderOpenPrice();
      }
     //Print("open_price  ", open_price); 
     
//-----------------------критерии покупки      
     if((r2 < 30 && r1 > 30 && b_orders == 0) || (b_orders > 0 && b_orders < orders_limit && Bid > open_price + dif*Point))
      return (buy_signal);  
//-----------------------критерии продажи      
     if((r2 > 70 && r1 < 70 && s_orders == 0) || (s_orders > 0 && s_orders < orders_limit && Ask < open_price - dif*Point))
      return (sell_signal);  
      break;
 
smartbutterfly:

Выложил код с устраненным багом...

Спасибо.
 
Пишет "Неправильное использование массива-таймсерии". Так и должно быть?
 
Testrader:
Пишет "Неправильное использование массива-таймсерии". Так и должно быть?


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

Интересно . Нет ли тут ошибки ?

//Рутина для закрытия ордера
void close_order(int ticket)
{
double price = 0;
bool temp = false;
int count = 0;
 while(!IsTradeAllowed()) Sleep(100);
 if(OrderType()==OP_BUY)  price = NormalizeDouble(Bid,Digits);
 if(OrderType()==OP_SELL) price = NormalizeDouble(Ask,Digits);
 if(OrderSelect(ticket,SELECT_BY_TICKET))
     while(temp == false)
     {
     if(OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP) temp = OrderDelete(ticket); 
     else temp = OrderClose(ticket,OrderLots(),price,slippage,CLR_NONE);
     Sleep(30000); RefreshRates();count++; 
     if (count > 5) break;
     }  
return;
}

Может быть так будет вернее

//Рутина для закрытия ордера
void close_order(int ticket)
{
double price = 0;
bool temp = false;
int count = 0;
 while(!IsTradeAllowed()) Sleep(100);
 if(OrderSelect(ticket,SELECT_BY_TICKET))
 if(OrderType()==OP_BUY)  price = NormalizeDouble(Bid,Digits);
 if(OrderType()==OP_SELL) price = NormalizeDouble(Ask,Digits);
     while(temp == false)
     {
     if(OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP) temp = OrderDelete(ticket); 
     else temp = OrderClose(ticket,OrderLots(),price,slippage,CLR_NONE);
     Sleep(30000); RefreshRates();count++; 
     if (count > 5) break;
     }  
return;
}

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

 
VOLDEMAR:

Интересно . Нет ли тут ошибки ?

...

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

Так-то рутина вызывается из функции через цикл после вызова ОрдерСелекта, по идее результат не должен затираться. Работает же, значит все ок.
//-----------------------закрытие продаж 
void close_all(string symbol, int mn){
 
for(int i=OrdersTotal()-1;i>=0;i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol() == symbol && OrderMagicNumber()==mn) close_order(OrderTicket());
return;
}
 

Только учусь писать, язык MQL4 изучаю чуть меньше месяца, для сотворения своего советника ( а опыта в етом у меня 0 ) чтобы даром не тратить решил поискать что то толковое

Во взор пал етот советник - Master_MM_Droid. Метод обучения был прост - понять принцип действия, сложить компактную для себя любимого блок-схему работы советника.

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

Очень, очень много ошибок, неточностей, отсутствие удобств в коде в целом.

Да в советнике изложены неплохие идеи, как на взгляд меня - новичка форекс (мульти ТС с мульти ММ), но использовать их весьма кривую реализацию для реальной торговли - ето бред даже для центовых щетов !!!

Советник не доработан, точнее даже не сделан чтобы работать на демо и ето печально, ведь данный код был выложен значит одобрен кем-то (((

Пишу по памяти то что помню (на мамке пк - вздулись конденсаторы, надеюсь перепаяют) :

прекращение start при value >0, ну да - не успело пощитать тик или связи 2 сек небыло - жди еще барчик; в switch(MM), где мани менеджмент стратегии описываются, часть ММ вообще нерабочие и неадекватные;

отсутствие refreshrate () перед работой с ордерами (веселые реквоты будут ждать );

отсутствие отработок ошибок ( оно то есть, но раз в 3 года и то только на принт в лог); и еще неточности в условиях, которые не всегда будут верно исполняться (ох как много их) ............

В общем - советник внимания не стоит - кривулька, а идея в нем заложена неплохо - только реализация (((( вот мое мнение

Причина обращения: