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

 
Помогите пожалуйста дописать код.

Нужно дописать ограничение на количество открытых ордеров.
Файлы:
mjj.txt  21 kb
 
Vadim Podoprigora:
Помогите пожалуйста дописать код.

Нужно дописать ограничение на количество открытых ордеров.

а как код должен работать и после чего ставить ограничение?

---------------------------------------------------------------------- 

кстати кто объяснит почему при любом значении данных

выражение   if ((AccountInfoDouble(ACCOUNT_EQUITY)*1.1>=AccountInfoDouble(ACCOUNT_BALANCE)) || (AccountInfoDouble(ACCOUNT_EQUITY)*0.9>=AccountInfoDouble(ACCOUNT_BALANCE)))

выдает true 

цель - обрезка больших колебаний

и последнее.

ищу материал по созданию кнопок 

надо все эти коды объединить в панель
 
trader781:

а как код должен работать и после чего ставить ограничение?

---------------------------------------------------------------------- 

кстати кто объяснит почему при любом значении данных

выражение   if ((AccountInfoDouble(ACCOUNT_EQUITY)*1.1>=AccountInfoDouble(ACCOUNT_BALANCE)) || (AccountInfoDouble(ACCOUNT_EQUITY)*0.9>=AccountInfoDouble(ACCOUNT_BALANCE)))

выдает true 

цель - обрезка больших колебаний

и последнее.

ищу материал по созданию кнопок 

надо все эти коды объединить в панель
В разделе статьи таких материалов полно. Самые простые примеры есть в справке к каждому типу графических объектов https://www.mql5.com/ru/docs/constants/objectconstants/enum_object/obj_button
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_BUTTON
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_BUTTON
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_BUTTON - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
trader781:

а как код должен работать и после чего ставить ограничение?

---------------------------------------------------------------------- 

кстати кто объяснит почему при любом значении данных

выражение   if ((AccountInfoDouble(ACCOUNT_EQUITY)*1.1>=AccountInfoDouble(ACCOUNT_BALANCE)) || (AccountInfoDouble(ACCOUNT_EQUITY)*0.9>=AccountInfoDouble(ACCOUNT_BALANCE)))

выдает true 

цель - обрезка больших колебаний

и последнее.

ищу материал по созданию кнопок 

надо все эти коды объединить в панель
Ограничение на количество одновременно открытых ордеров.
 
Vadim Podoprigora:
Ограничение на количество одновременно открытых ордеров.
Держи
Файлы:
55677.mq4  42 kb
 
Всем здравствуйте, дали задания написать советник, который торгует следующим образом: 
Определяем минимум и максимум цены за период времени который указал пользователь (например с 00-00 до 02-00). Покупка: на свече цена вышла за минимум, продажа: цена вышла за максимум. При открытой позиции новых сделок не открываем. Закрытие позиции осуществляем в указанное время (так же указывается пользователем, допустим в 22-00) или по SL\TP (указываются пользователем). 


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

Кто подскажет куда копать и где искать заранее спасибо. Если кто-то поможет кодом то это было бы отлично.
 
Anarchist:
Всем здравствуйте, дали задания написать советник, который торгует следующим образом: 
Определяем минимум и максимум цены за период времени который указал пользователь (например с 00-00 до 02-00). Покупка: на свече цена вышла за минимум, продажа: цена вышла за максимум. При открытой позиции новых сделок не открываем. Закрытие позиции осуществляем в указанное время (так же указывается пользователем, допустим в 22-00) или по SL\TP (указываются пользователем). 


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

Кто подскажет куда копать и где искать заранее спасибо. Если кто-то поможет кодом то это было бы отлично.
Это курсовая работа?
 
Alexey Viktorov:
Это курсовая работа?
Это простая лабораторная работа, тут все эти (указывается пользователем) указываются как переменные в коде в начале программы + считаем, что пользователь не дурак.
 
Anarchist:
Всем здравствуйте, дали задания написать советник, который торгует следующим образом: 
Определяем минимум и максимум цены за период времени который указал пользователь (например с 00-00 до 02-00). Покупка: на свече цена вышла за минимум, продажа: цена вышла за максимум. При открытой позиции новых сделок не открываем. Закрытие позиции осуществляем в указанное время (так же указывается пользователем, допустим в 22-00) или по SL\TP (указываются пользователем). 


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

Кто подскажет куда копать и где искать заранее спасибо. Если кто-то поможет кодом то это было бы отлично.

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

 

//+------------------------------------------------------------------+
//|                                                       test07.mq4 |
//|                                                   Sergey Gritsay |
//|                         https://www.mql5.com/ru/users/sergey1294 |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritsay"
#property link      "https://www.mql5.com/ru/users/sergey1294"
#property version   "1.00"
#property strict

input string analysis_time_start="10:00";
input string analysis_time_end="12:00";
input string time_out="16:00";
input string time_out_close="23:00";

input int    shift_open=0;
input int    MagicNumber=20110315;       // Номер копии
input double Lot=0.01;           // Объем лота
input int    StopLoss     = 300;            // Стоп Лосс (Пипс)
input int    TakeProfit   = 500;            // Тейк Профит (Пипс)
input int    Slippage     = 10;             // Проскальзование (Пипс)
input string CommentOrder="test";     // Комментарий к ордеру

double   up_price=0.0;
double down_price=0.0;
double hist_high[];
double hist_low[];
double hist_close[];
MqlDateTime times;
MqlRates rates[];
datetime d1;
datetime d2;
datetime d3;
datetime d4;
bool flag_open=false;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   VLineCreate(0,"Line_start");
   VLineCreate(0,"Line_end");
   VLineCreate(0,"Line_time_out");
   VLineCreate(0,"Line_time_out_close");
   HLineCreate(0,"Line_max");
   HLineCreate(0,"Line_min");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   VLineDelete(0,"Line_start");
   VLineDelete(0,"Line_end");
   VLineDelete(0,"Line_time_out");
   VLineDelete(0,"Line_time_out_close");
   HLineDelete(0,"Line_max");
   HLineDelete(0,"Line_min");
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   datetime date=TimeCurrent(times);
   int ty=times.year;
   int tm=times.mon;
   int td=times.day;
   d1=StringToTime((string)ty+"."+(string)tm+"."+(string)td+" "+analysis_time_start);
   d2=StringToTime((string)ty+"."+(string)tm+"."+(string)td+" "+analysis_time_end);
   d3=StringToTime((string)ty+"."+(string)tm+"."+(string)td+" "+time_out);
   d4=StringToTime((string)ty+"."+(string)tm+"."+(string)td+" "+time_out_close);

   if(!flag_open && date>d1 && date<d2)flag_open=true;
   if(date>=d3 && d2<d3)flag_open=false;

   if(date>d2)
     {
      if(CopyLow(_Symbol,0,d1,d2,hist_low)<0)return;
      if(CopyHigh(_Symbol,0,d1,d2,hist_high)<0)return;
      up_price=NormalizeDouble(hist_high[ArrayMaximum(hist_high)],_Digits);
      down_price=NormalizeDouble(hist_low[ArrayMinimum(hist_low)],_Digits);
     }

   VLineMove(0,"Line_start",d1);
   VLineMove(0,"Line_end",d2);
   VLineMove(0,"Line_time_out",d3);
   VLineMove(0,"Line_time_out_close",d4);
   HLineMove(0,"Line_max",up_price);
   HLineMove(0,"Line_min",down_price);

   Comment(
           "\n date = ",date,
           "\n d1 = ",TimeToString(d1),
           "\n d2 = ",TimeToString(d2),
           "\n d3 = ",TimeToString(d3),
           "\n d4 = ",TimeToString(d4)
           );

   if(flag_open)
     {
      if(TotalOrder()==0)
        {
         if(CopyRates(_Symbol,PERIOD_CURRENT,0,shift_open+2,rates)==shift_open+2)
           {
            if(date>d2 && date<d3 && d2<d3 && rates[shift_open].time>d2)
              {
               if(rates[shift_open].close>=up_price && rates[shift_open+1].close<=up_price)
                 {
                  OrderOpen(OP_BUY);
                 }

               if(rates[shift_open].close<=down_price && rates[shift_open+1].close>=down_price)
                 {
                  OrderOpen(OP_SELL);
                 }
              }
           }
        }
     }

   if(date>=d4 && d2<d4)
     {
      OrderClose();
     }

   ModifySL(StopLoss);
   ModifyTP(TakeProfit);
  }
//+------------------------------------------------------------------+
int TotalOrder()
  {
   int value=0;
   int total=OrdersTotal();
   for(int i=total-1; i>=0; i--)
     {
      if(!OrderSelect(i,SELECT_BY_POS))continue;
      if(OrderSymbol()!=Symbol())continue;
      if(OrderMagicNumber()!=MagicNumber)continue;
      if(OrderType()>1)continue;
      value++;
     }
   return(value);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OrderOpen(int type)
  {
   double price_open=0.0;
   if(type==WRONG_VALUE)return;
   if(!IsTradeAllowed())return;

   if(type==OP_BUY)price_open = NormalizeDouble(Ask,_Digits);
   if(type==OP_SELL)price_open = NormalizeDouble(Bid,_Digits);

   int ticket=OrderSend(_Symbol,type,Lot,price_open,Slippage,0,0,CommentOrder,MagicNumber);
   if(ticket<0)Print("Ошибка открытия ордера № - ",GetLastError());
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OrderClose()
  {
   double price_close=0.0;
   if(!IsTradeAllowed())return;
   int total=OrdersTotal();
   for(int i=total-1; i>=0; i--)
     {
      if(!OrderSelect(i,SELECT_BY_POS))continue;
      if(OrderMagicNumber()!=MagicNumber)continue;
      if(OrderSymbol()!=_Symbol)continue;
      if(OrderType()!=OP_BUY && OrderType()!=OP_SELL)continue;
      if(OrderType()==OP_BUY)price_close=NormalizeDouble(Bid,_Digits);
      if(OrderType()==OP_SELL)price_close=NormalizeDouble(Ask,_Digits);
      bool res=OrderClose(OrderTicket(),OrderLots(),price_close,Slippage);
      if(!res)Print("Ошибка закрытия ордера № - ",GetLastError());
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void ModifySL(double sl)
  {
   if(sl<=0)return;
   double price_sl=0.0;
   int total=OrdersTotal();
   for(int i=total-1; i>=0; i--)
     {
      if(!OrderSelect(i,SELECT_BY_POS))continue;
      if(OrderMagicNumber()!=MagicNumber)continue;
      if(OrderSymbol()!=_Symbol)continue;
      if(OrderType()>1)continue;
      if(OrderStopLoss()==0)
        {
         if(OrderType()==OP_BUY)price_sl=NormalizeDouble(OrderOpenPrice()-sl*_Point,_Digits);
         if(OrderType()==OP_SELL)price_sl=NormalizeDouble(OrderOpenPrice()+sl*_Point,_Digits);
         if(price_sl<=0)continue;
         bool res=OrderModify(OrderTicket(),OrderOpenPrice(),price_sl,OrderTakeProfit(),0);
         if(!res)Print("Ошибка модификации стоп лосса ордера № - ",GetLastError());
        }
     }
  }
//+------------------------------------------------------------------+
void ModifyTP(double tp)
  {
   if(tp<=0)return;
   double price_tp=0.0;
   int total=OrdersTotal();
   for(int i=total-1; i>=0; i--)
     {
      if(!OrderSelect(i,SELECT_BY_POS))continue;
      if(OrderMagicNumber()!=MagicNumber)continue;
      if(OrderSymbol()!=_Symbol)continue;
      if(OrderType()>1)continue;
      if(OrderTakeProfit()==0)
        {
         if(OrderType()==OP_BUY)price_tp=NormalizeDouble(OrderOpenPrice()+tp*_Point,_Digits);
         if(OrderType()==OP_SELL)price_tp=NormalizeDouble(OrderOpenPrice()-tp*_Point,_Digits);
         if(price_tp<=0)continue;
         bool res=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),price_tp,0);
         if(!res)Print("Ошибка модификации тейк профита ордера № - ",GetLastError());
        }
     }
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Создает вертикальную линию                                       |
//+------------------------------------------------------------------+
bool VLineCreate(const long            chart_ID=0,        // ID графика
                 const string          name="VLine",      // имя линии
                 const int             sub_window=0,      // номер подокна
                 datetime              time=0,            // время линии
                 const color           clr=clrRed,        // цвет линии
                 const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль линии
                 const int             width=1,           // толщина линии
                 const bool            back=false,        // на заднем плане
                 const bool            selection=true,    // выделить для перемещений
                 const bool            ray=true,          // продолжение линии вниз
                 const bool            hidden=true,       // скрыт в списке объектов
                 const long            z_order=0)         // приоритет на нажатие мышью
  {
//--- если время линии не задано, то проводим ее через последний бар
   if(!time)
      time=TimeCurrent();
//--- сбросим значение ошибки
   ResetLastError();
//--- создадим вертикальную линию
   if(!ObjectCreate(chart_ID,name,OBJ_VLINE,sub_window,time,0))
     {
      Print(__FUNCTION__,
            ": не удалось создать вертикальную линию! Код ошибки = ",GetLastError());
      return(false);
     }
//--- установим цвет линии
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- установим стиль отображения линии
   ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- установим толщину линии
   ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- отобразим на переднем (false) или заднем (true) плане
   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- включим (true) или отключим (false) режим перемещения линии мышью
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- включим (true) или отключим (false) режим отображения линии в подокнах графика
   ObjectSetInteger(chart_ID,name,OBJPROP_RAY,ray);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
   ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- установим приоритет на получение события нажатия мыши на графике
   ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- успешное выполнение
   return(true);
  }
//+------------------------------------------------------------------+
//| Перемещение вертикальной линии                                   |
//+------------------------------------------------------------------+
bool VLineMove(const long   chart_ID=0,   // ID графика
               const string name="VLine", // имя линии
               datetime     time=0)       // время линии
  {
//--- если время линии не задано, то перемещаем ее на последний бар
   if(!time)
      time=TimeCurrent();
//--- сбросим значение ошибки
   ResetLastError();
//--- переместим вертикальную линию
   if(!ObjectMove(chart_ID,name,0,time,0))
     {
      Print(__FUNCTION__,
            ": не удалось переместить вертикальную линию! Код ошибки = ",GetLastError());
      return(false);
     }
//--- успешное выполнение
   return(true);
  }
//+------------------------------------------------------------------+
//| Удаляет вертикальную линию                                       |
//+------------------------------------------------------------------+
bool VLineDelete(const long   chart_ID=0,   // ID графика
                 const string name="VLine") // имя линии
  {
//--- сбросим значение ошибки
   ResetLastError();
//--- удалим вертикальную линию
   if(!ObjectDelete(chart_ID,name))
     {
      Print(__FUNCTION__,
            ": не удалось удалить вертикальную линию! Код ошибки = ",GetLastError());
      return(false);
     }
//--- успешное выполнение
   return(true);
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Создает горизонтальную линию                                     |
//+------------------------------------------------------------------+
bool HLineCreate(const long            chart_ID=0,        // ID графика
                 const string          name="HLine",      // имя линии
                 const int             sub_window=0,      // номер подокна
                 double                price=0,           // цена линии
                 const color           clr=clrRed,        // цвет линии
                 const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль линии
                 const int             width=1,           // толщина линии
                 const bool            back=false,        // на заднем плане
                 const bool            selection=true,    // выделить для перемещений
                 const bool            hidden=true,       // скрыт в списке объектов
                 const long            z_order=0)         // приоритет на нажатие мышью
  {
//--- если цена не задана, то установим ее на уровне текущей цены Bid
   if(!price)
      price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- сбросим значение ошибки
   ResetLastError();
//--- создадим горизонтальную линию
   if(!ObjectCreate(chart_ID,name,OBJ_HLINE,sub_window,0,price))
     {
      Print(__FUNCTION__,
            ": не удалось создать горизонтальную линию! Код ошибки = ",GetLastError());
      return(false);
     }
//--- установим цвет линии
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- установим стиль отображения линии
   ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- установим толщину линии
   ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- отобразим на переднем (false) или заднем (true) плане
   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- включим (true) или отключим (false) режим перемещения линии мышью
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
   ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- установим приоритет на получение события нажатия мыши на графике
   ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- успешное выполнение
   return(true);
  }
//+------------------------------------------------------------------+
//| Перемещение горизонтальной линии                                 |
//+------------------------------------------------------------------+
bool HLineMove(const long   chart_ID=0,   // ID графика
               const string name="HLine", // имя линии
               double       price=0)      // цена линии
  {
//--- если цена линии не задана, то перемещаем ее на уровень текущей цены Bid
   if(!price)
      price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- сбросим значение ошибки
   ResetLastError();
//--- переместим горизонтальную линию
   if(!ObjectMove(chart_ID,name,0,0,price))
     {
      Print(__FUNCTION__,
            ": не удалось переместить горизонтальную линию! Код ошибки = ",GetLastError());
      return(false);
     }
//--- успешное выполнение
   return(true);
  }
//+------------------------------------------------------------------+
//| Удаляет горизонтальную линию                                     |
//+------------------------------------------------------------------+
bool HLineDelete(const long   chart_ID=0,   // ID графика
                 const string name="HLine") // имя линии
  {
//--- сбросим значение ошибки
   ResetLastError();
//--- удалим горизонтальную линию
   if(!ObjectDelete(chart_ID,name))
     {
      Print(__FUNCTION__,
            ": не удалось удалить горизонтальную линию! Код ошибки = ",GetLastError());
      return(false);
     }
//--- успешное выполнение
   return(true);
  }

//+------------------------------------------------------------------+

 ...

Файлы:
test07.mq4  34 kb
 
был косячок в блоке закрытия ордеров исправил.
Причина обращения: