MQL4: Советник модификации TP по условию / нужна проверка кода - страница 3

 
Artyom Trishkin:
А в журнале что пишет?
2016.05.03 15:50:57.343 '11148215': order #335191397 buy 0.47 AUDCHF at 0.71651 was modified -> sl: 0.71400 tp: 0.71670

Свеча закрылась ниже условия в 15-49, соответственно в 15-50-00 должен был модифицировать. 

Проверю еще.

 

А сейчас все сработало как надо, ничего не понимаю. 

Я попроверяю еще, но если вдруг Вы сами увидите какую ошибку - дайте, пожалуйста, знать. 

 

Да вроде все работает, и на продажу, и на покупку. Не пойму, почему в самый первый раз была задержка.

Спасибо! 

 
Ivan Molchanov:

Да вроде все работает, и на продажу, и на покупку. Не пойму, почему в самый первый раз была задержка.

Спасибо! 

Я уже писал почему в самый первый раз была задержка. Журнал-то нужно весь смотреть, а не только модификацию. Там и видно должно быть в какое время активирована отложка, а в какое модифицирован тейк.

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

 
Artyom Trishkin:

Я уже писал почему в самый первый раз была задержка. Журнал-то нужно весь смотреть, а не только модификацию. Там и видно должно быть в какое время активирована отложка, а в какое модифицирован тейк.

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

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

Вообще это не очень хорошо. Как бы сделать так, чтобы во время установки советника, если именно этот бар и закроется по условию, советник уже сработал? 

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

 

Возвращаясь к вопросу работы советника при выполнении условия на баре, на котором советник был запущен - в принципе, ведь если убрать проверку времени баров (текущий - прошлый) - то все должно работать ведь как надо? Т.е. просто алгортитм советника будет гоняться каждый тик, но выполняться он будет только когда у нас появится Close[1], т.е. в начале нового бара.

Насколько такой советник плох? Будет ли он как-то грузить терминал/брокера? Или все нормально и допустимо, а мои тревоги напрасны? 

 
Ivan Molchanov:

Возвращаясь к вопросу работы советника при выполнении условия на баре, на котором советник был запущен - в принципе, ведь если убрать проверку времени баров (текущий - прошлый) - то все должно работать ведь как надо? Т.е. просто алгортитм советника будет гоняться каждый тик, но выполняться он будет только когда у нас появится Close[1], т.е. в начале нового бара.

Насколько такой советник плох? Будет ли он как-то грузить терминал/брокера? Или все нормально и допустимо, а мои тревоги напрасны? 

Сервер он грузить никоим образом не будет - все данные берутся из окружения терминала. В терминал они приходят с каждым новым тиком.
 
Ivan Molchanov:

Возвращаясь к вопросу работы советника при выполнении условия на баре, на котором советник был запущен - в принципе, ведь если убрать проверку времени баров (текущий - прошлый) - то все должно работать ведь как надо? Т.е. просто алгортитм советника будет гоняться каждый тик, но выполняться он будет только когда у нас появится Close[1], т.е. в начале нового бара.

Насколько такой советник плох? Будет ли он как-то грузить терминал/брокера? Или все нормально и допустимо, а мои тревоги напрасны? 

Вообще первый раз вижу что бы тейкпрофит ставили в безубыток

input double BE=0; // уровень безубыточности

 обычно стоплосс ставят.

Вот набросал такой вариантик из своих готовых функций.

//+------------------------------------------------------------------+
//|                                                       test_2.mq4 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
enum ENUM_TYPE_ORDER
  {
   BUY=0,
   SELL=1,
  };

input int Magic=0; // магический номер эксперта
input double checkline=0; // контрольная ближняя граница
input double BE=0; // уровень безубыточности
input ENUM_TYPE_ORDER Type=BUY; //направление торговли:
input int ticket=0; // номер ордера
                    //int Slippage= 50; // проскальзывание в пп.
input string com="Перевод в БУ"; // комментарий ордера
datetime last;
string rezult;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   last=Time[0]; // запомнили время бара для последующего тика
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(last==Time[0]) return;
   if(Type==BUY && Close[1]<checkline)
     {
      if(ModifyTP(_Symbol,ticket,OP_BUY,BE))last=Time[0];
     }
   if(Type==SELL && Close[1]>checkline)
     {
      if(ModifyTP(_Symbol,ticket,OP_SELL,BE))last=Time[0];
     }
  }
//+------------------------------------------------------------------+
bool ModifyTP(string symbol,int tiket,int type,double tp)
  {
   if(tp<=0)return(false);
   bool res;
   //double bid=SymbolInfoDouble(symbol,SYMBOL_BID);
   //double ask=SymbolInfoDouble(symbol,SYMBOL_ASK);
   //double point=SymbolInfoDouble(symbol,SYMBOL_POINT);
   //int digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS);

   //if(bid<=0.0)return(false);
   //if(ask<=0.0)return(false);

   int total=OrdersTotal();

   for(int i=0; i<total; i++)
     {
      if(!OrderSelect(i,SELECT_BY_POS))continue;
      if(OrderTicket()!=tiket)continue;
      if(OrderMagicNumber()!=Magic)continue;
      if(OrderSymbol()!=symbol)continue;
      if(OrderType()>1 || OrderType()!=type)continue;
      if(OrderTakeProfit()!=0)continue;

      //if(OrderType()==OP_BUY) tp=NormalizeDouble(normalize(symbol,bid+tp*point),digits);
      //if(OrderType()==OP_SELL) tp=NormalizeDouble(normalize(symbol,ask-tp*point),digits);
      if(tp<0)continue;
      res=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),tp,0);
      if(!res)
        {
         int error=GetLastError();
         rezult=StringConcatenate(OrderSymbol(),": error modifying TakeProfit order ",OrderTicket()," ",StrToType(OrderType())," №- ",error);
         Print(rezult);
         return(false);
        }
     }
   return(true);
  }
//+------------------------------------------------------------------+
string StrToType(int type)
  {
   if(type==OP_BUY)return("BUY");
   if(type==OP_SELL)return("SELL");
   return((string)type);
  }
//+------------------------------------------------------------------+
double normalize(string symbol,double value)
  {
   double ts=SymbolInfoDouble(symbol,SYMBOL_TRADE_TICK_SIZE);
   if(ts==0)return(value);
   return(NormalizeDouble(value/ts,0)*ts);
  }
//+------------------------------------------------------------------+
Причина обращения: