Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1077

 

Добрый день,

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

Имею ввиду :  на терминале я могу поставить кнопки на график и менять режим без переинициализации. Могу я использовать бот телеграмма давать команды советнику на впсе ?

Или нужно использовать другую альтернативу изменения режима советника на mql vps без повторной синхронизации ? 


Спасибо за ответ!

 

Здравствуйте, уважаемые эксперты!

Помогите, пожалуйста решить проблему.

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

Если можно, подскажите как изменить код:

bool operation=0;for(int pos=0;pos<OrdersTotal();pos++)
     {if ( OrderSelect (pos, SELECT_BY_POS) == false )  continue;
      if ( OrderSymbol()==Symbol()) break;}


//=========================================================================================================
if(Hour()>=2&&Hour()<=18&&operation==0){
if(OPB1==1)
   {operation=1;if(operation==0 &&OrderSymbol()!=Symbol()||OrdersTotal()==0)
        {OrderSend(Symbol(),OP_BUY,lots,Ask,0,Bid-ss*Point,Ask+T*Point,"My order#",mn,0,Green);}}
        if (OrderType()==OP_BUY &&OrdersTotal()==1&&OrderMagicNumber()==8)
        {OrderSend(Symbol(),OP_SELLSTOP,5*lots,OrderOpenPrice()-(ss-ss/4)*Point,0,0,SstopClose,"My order#",80,0,Red);}
       

if(OPS1==1)
   {operation=1;if(operation==0 &&OrderSymbol()!=Symbol()||OrdersTotal()==0)        
         {OrderSend(Symbol(),OP_SELL,lots,Bid,0,Ask+ss*Point,Bid-T*Point,"My order#",mn,0,Red);}}
         if (OrderType()==OP_SELL &&OrdersTotal()==1&&OrderMagicNumber()==8)
         {OrderSend(Symbol(),OP_BUYSTOP,5*lots,OrderOpenPrice()+(ss-ss/4)*Point,0,0,BstopClose,"My order#",80,0,Green);}}



if(OrderMagicNumber()==80){operation=0;
 {for( int  ii=OrdersTotal()-1;ii>=0;ii--)
       {OrderSelect(ii, SELECT_BY_POS);
        int  type   = OrderType();bool result = false;
        switch(type)
         {case OP_BUYSTOP   : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Red );//break;
          case OP_SELLSTOP  : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, Red ); //break;
         
          result = OrderDelete( OrderTicket() );//break;
          }}}}
 

Добрый день уважаемые форумчане.

Помогите доработать индикатор строящий зоны на графике.

В имеющимся индикаторе зоны задаются на все дни недели.

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

//+------------------------------------------------------------------+
//|                                            2 ЗОНЫ.mq4            |
//|                                                                  |
//|                                                                  |
//|                                                                  |
//|  2017                                                            |
//+------------------------------------------------------------------+

#property indicator_chart_window

//------- Внешние параметры индикатора -------------------------------
extern int    NumberOfDays = 150;        // Количество дней
extern string Begin_1      = "03:00";
extern string End_1        = "08:00";
extern color  Color_1      = PowderBlue;
extern string Begin_2      = "09:00";
extern string End_2        = "16:30";
extern color  Color_2      = Yellow;
extern bool   HighRange    = true;


//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void init() {
  DeleteObjects();
  for (int i=0; i<NumberOfDays; i++) {
    CreateObjects("PWT1"+i, Color_1);
    CreateObjects("PWT2"+i, Color_2);
  }
  Comment("");
}

//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
void deinit() {
  DeleteObjects();
  Comment("");
}

//+------------------------------------------------------------------+
//| Создание объектов индикатора                                     |
//| Параметры:                                                       |
//|   no - наименование объекта                                      |
//|   cl - цвет объекта                                              |
//+------------------------------------------------------------------+
void CreateObjects(string no, color cl) {
  ObjectCreate(no, OBJ_RECTANGLE, 0, 0,0, 0,0);
  ObjectSet(no, OBJPROP_STYLE, STYLE_SOLID);
  ObjectSet(no, OBJPROP_COLOR, cl);
  ObjectSet(no, OBJPROP_BACK, True);
}

//+------------------------------------------------------------------+
//| Удаление объектов индикатора                                     |
//+------------------------------------------------------------------+
void DeleteObjects() {
  for (int i=0; i<NumberOfDays; i++) {
    ObjectDelete("PWT1"+i);
    ObjectDelete("PWT2"+i);
  }
}

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
void start() {
  datetime dt=CurTime();

  for (int i=0; i<NumberOfDays; i++) {
    DrawObjects(dt, "PWT1"+i, Begin_1, End_1);
    DrawObjects(dt, "PWT2"+i, Begin_2, End_2);
    dt=decDateTradeDay(dt);
    while (TimeDayOfWeek(dt)>5) dt=decDateTradeDay(dt);
  }
}

//+------------------------------------------------------------------+
//| Прорисовка объектов на графике                                   |
//| Параметры:                                                       |
//|   dt - дата торгового дня                                        |
//|   no - наименование объекта                                      |
//|   tb - время начала сессии                                       |
//|   te - время окончания сессии                                    |
//+------------------------------------------------------------------+
void DrawObjects(datetime dt, string no, string tb, string te) {
  datetime t1, t2, t3;
  double   p1, p2, p3;
  int      b1, b2;

  t1=StrToTime(TimeToStr(dt, TIME_DATE)+" "+tb);
  t2=StrToTime(TimeToStr(dt, TIME_DATE)+" "+te);
  t3=StrToTime(TimeToStr(dt, TIME_DATE)+" ""23:00");
  b1=iBarShift(NULL, 0, t1);                            //Поиск бара по времени
  b2=iBarShift(NULL, 0, t2);
  p1=High[iHighest(NULL, PERIOD_M5, MODE_HIGH, b1-b2, b2)];  // 
  p2=Low [iLowest (NULL, PERIOD_M5, MODE_LOW , b1-b2, b2)]; // 
  p3=p2;
  if (!HighRange) {p1=0; p2=2*p2;}
  ObjectSet(no, OBJPROP_TIME1 , t1);
  ObjectSet(no, OBJPROP_PRICE1, p1);
  ObjectSet(no, OBJPROP_TIME2 , t2);
  ObjectSet(no, OBJPROP_PRICE2, p2);
  ObjectSet(no, OBJPROP_TIME2 , t3);
  ObjectSet(no, OBJPROP_PRICE2, p3);
}

//+------------------------------------------------------------------+
//| Уменьшение даты на один торговый день                            |
//| Параметры:                                                       |
//|   dt - дата торгового дня                                        |
//+------------------------------------------------------------------+
datetime decDateTradeDay (datetime dt) {
  int ty=TimeYear(dt);
  int tm=TimeMonth(dt);
  int td=TimeDay(dt);
  int th=TimeHour(dt);
  int ti=TimeMinute(dt);

  td--;
  if (td==0) {
    tm--;
    if (tm==0) {
      ty--;
      tm=12;
    }
    if (tm==1 || tm==3 || tm==5 || tm==7 || tm==8 || tm==10 || tm==12) td=31;
    if (tm==2) if (MathMod(ty, 4)==0) td=29; else td=28;
    if (tm==4 || tm==6 || tm==9 || tm==11) td=30;
  }
  return(StrToTime(ty+"."+tm+"."+td+" "+th+":"+ti));
}
//+------------------------------------------------------------------+

Файлы:
2_aqi4.ex4  17 kb
2_mne7.mq4  11 kb
 
Maxim Kuznetsov:

уберите условия "if (OrdersTotal()==0)...." - они как раз-то и говорят: ищем входы и открываем новые ордера только когда ордеров нет вообще.

а чтобы без такого условия не открывалась сразу большая пачка новых - надо придумывать доп.условие. А это уже от вашей стратегии: не открывать новый в течении времени T от предыдущего или контроллировать бары или соблюдать дистанции в пунктах меж ордерами..

Понял, благодарю)

 
Возможно ли в МТ5 представлять результаты торговли на реальном счете в виде графика, как это наглядно видно в тестере стратегий?
Тестирование стратегий - Алгоритмический трейдинг, торговые роботы - Справка по MetaTrader 5
Тестирование стратегий - Алгоритмический трейдинг, торговые роботы - Справка по MetaTrader 5
  • www.metatrader5.com
Тестер стратегий позволяет тестировать и оптимизировать торговые стратегии (советники) перед началом использования их в реальной торговле. При тестировании советника происходит его однократная прогонка с начальными параметрами на исторических данных. При оптимизации торговая стратегия прогоняется несколько раз с различным набором параметров...
 

Ребят, особенно разработчики, подскажите есть ли возможность решить такую задачку? Задачка на рисунке


 

Добрый день, появляется предупреждение "possible loss of data due to type conversion" на переменную n в выделенном месте

// Переводим строку в верхний регистр
string StringUpper(string s) {
  int c, i, k=StringLen(s), n;
  for (i=0; i<k; i++) {
    n=0;
    c=StringGetChar(s, i);
    if (c>96 && c<123) n=c-32;    // a-z -> A-Z
    if (c>223 && c<256) n=c-32;   // а-я -> А-Я
    if (c==184) n=168;            //  ё  ->  Ё
    if (n>0) s=StringSetChar(s, i, n);
  }
  return(s);
}

Подскажите, пожалуйста, как поправить?

 
Sergey:

Добрый день, появляется предупреждение "possible loss of data due to type conversion" на переменную n в выделенном месте

Подскажите, пожалуйста, как поправить?

Либо ushort n=0;

Либо StringSetChar(s, i, (ushort)n);

Но лучше использовать функцию StringSetCharacter().

Документация по MQL5: Строковые функции / StringSetCharacter
Документация по MQL5: Строковые функции / StringSetCharacter
  • www.mql5.com
Если значение pos меньше длины строки и значение символьного кода = 0, то строка усекается (но размер буфера, распределенного под строку остается неизменным). Длина строки становится равной значению pos.
 
У этого сайта есть функционал, добавлять статьи в избранное?
Как это сделано для тем.
 

Добрый день.

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

Сейчас при закрытии по профиту закрываются все отложенные ордера на всех валютах.

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

Что нужно поменять в этом коде?:

if(OrderMagicNumber()==Mn){operation=0;
 {for( int  i=OrdersTotal()-1;i>=0;i--)
       {OrderSelect(i, SELECT_BY_POS);
        int  type   = OrderType();bool result = false;
        switch(type)
         {case OP_BUYSTOP   : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Red );//break;
          case OP_SELLSTOP  : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, Red ); //break; 
          
          result = OrderDelete( OrderTicket() );//break;
          }}}}

Mn  в этом коде - магический номер отложенного ордера BUY_STOP или SELL_STOP.

Логика такая, что при закрытии открытой позиции по тейк-профиту, остается выставленный ордер с этим магиком и по идее выполняется команда на удаление.

Это работает при тесте каждой пары. Однако в случае работы с остальными валютами удаляются все выставленные ордера по всем парам.

Помогите, кто сможет.

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

Буду очень признателен.

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