Создание робота - страница 8

 

ОГРОМНОЕ ВСЕМ СПАСИБО!!!

Программный код, который создает на текущем графике индикатор ZigZagColor и удаляет его после закрытия советника выглядит так:

в блоке инициализации советника

//--- create handle of the indicator iCustom
   handle_iCustom=iCustom(m_symbol.Name(),Period(),"Examples\\ZigzagColor",
                          Inp_ZZ_Depth,
                          Inp_ZZ_Deviation,
                          Inp_ZZ_Backstep);
   ChartIndicatorAdd(ChartID(),0,handle_iCustom);

в блоке деинициализации советника

(ВНИМАНИЕ для тех кто будет использовать данный код! Данный вариант кода промежуточный и применим только для настроек индикатора Inp_ZZ_Depth=80; Inp_ZZ_Deviation=20; Inp_ZZ_Backstep=0; при других настройках индикатор удаляться не будет! Чтобы индикатор удалялся при других настройках в блоке деинициализации нужно указать их вместо 80,20,0.)

//---
  ChartIndicatorDelete(0,0,"ZigZag(80,20,0)");

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

//---
  ChartIndicatorDelete(0,0,"ZigZag("+Inp_ZZ_Depth+","+Inp_ZZ_Deviation+","+Inp_ZZ_Backstep+")");

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

implicit conversion from 'number' to 'string'   ZigZag_Fibonacci_(M1).mq5       230     38

Подозреваю, что всё дело в этих значениях: "+Inp_ZZ_Depth+", "+Inp_ZZ_Deviation+","+Inp_ZZ_Backstep+". В общем нужно дальше изучать язык программирования MQL5.

Ещё раз всех благодарю за оказанное содействие!!!

С уважением, Владимир.

 
MrBrooklin:

ОГРОМНОЕ ВСЕМ СПАСИБО!!!

Окончательный код, который создает на текущем графике индикатор ZigZagColor и удаляет его после закрытия советника выглядит так:

в блоке инициализации советника

в блоке деинициализации советника

(ВНИМАНИЕ для тех кто будет использовать данный код! Данный вариант кода промежуточный и применим только для настроек индикатора Inp_ZZ_Depth=80; Inp_ZZ_Deviation=20; Inp_ZZ_Backstep=0; при других настройках индикатор удаляться не будет! Чтобы индикатор удалялся при других настройках в блоке деинициализации нужно указать их вместо 80,20,0.)

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

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

Подозреваю, что всё дело в этих значениях: "+Inp_ZZ_Depth+", "+Inp_ZZ_Deviation+","+Inp_ZZ_Backstep+". В общем нужно дальше изучать язык программирования MQL5.

Ещё раз всех благодарю за оказанное содействие!!!

С уважением, Владимир.

 ChartIndicatorDelete(0,0,"ZigZag("+(string)Inp_ZZ_Depth+","+(string)Inp_ZZ_Deviation+","+(string)Inp_ZZ_Backstep+")");

Предупреждение на не явное приведение типов. для стрикт (строгого) исполнения не явное приведение дает предупреждение.

Надо явно типы приводить. А в МТ5 всегда строгое исполнение. В МТ4 можно выбрать, и не указать в свойствах #property strict

 
SanAlex:

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

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

Знаю то что слепил, не хватает туда, еще Трала для линии.   

Добавил трал 

input string   t0="---- Trailing Line:      -----";              //
input ushort   InpObjTrailingStop           = 0;                 // Obj: Trailing Stop (distance from price to object, in pips)
input ushort   InpObjTrailingStep           = 0;                 // Obj: Trailing Step, in pips (1.00045-1.00055=1 pips)
input string   t1="---- Line Name           -----";              //
input string   InpObjUpName                 = "Имя Линии Up";    // Obj: Up (Trailing Horizontal Line) or Trend Line)
input ENUM_TRADE_COMMAND InpTradeCommand    = UpName_s;          // Obj:  command: UP
input string   InpObjDownName               = "Имя Линии Down";  // Obj: Down (Trailing Horizontal Line) or Trend Line)
input ENUM_TRADE_COMMAND InTradeCommand     = DownName_b;        // Obj:  command: DOWN
input ushort   InpObjStep                   = 15;                // Obj: Step (distance from price to object, in pips)
Файлы:
0006.mq5  109 kb
 
Valeriy Yastremskiy:

Предупреждение на не явное приведение типов. для стрикт (строгого) исполнения не явное приведение дает предупреждение.

Надо явно типы приводить. А в МТ5 всегда строгое исполнение. В МТ4 можно выбрать, и не указать в свойствах #property strict

Вы правы, Валерий! В таком виде всё работает так, как надо. Окончательный вариант в блоке инициализации советника:

//--- create handle of the indicator iCustom
   handle_iCustom=iCustom(m_symbol.Name(),Period(),"Examples\\ZigzagColor",
                          Inp_ZZ_Depth,
                          Inp_ZZ_Deviation,
                          Inp_ZZ_Backstep);
   ChartIndicatorAdd(ChartID(),0,handle_iCustom);

в блоке деинициализации советника:

ChartIndicatorDelete(0,0,"ZigZag("+(string)Inp_ZZ_Depth+","+(string)Inp_ZZ_Deviation+","+(string)Inp_ZZ_Backstep+")");

Спасибо за подсказку!

С уважением, Владимир.

 
Роман Жилин:

Ооо, огромное спасибо, с таким колличеством информации можно столько дел наворотить...

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


С уважением, Роман

Всем доброго дня!

Пока Роман в командировке и не учавствует в данной ветке, продолжу вместо него задавать вопросы по языку программирования MQL5. Нашел в CodeBase по ссылке https://www.mql5.com/ru/code/2142 библиотеку Maximum Percentage of Equity Risk. Решил попробовать в коде одного простого советника реализовать открытие позиций на покупку и продажу, но только не с фиксированным лотом, а с максимальным процентом риска капитала.

Вот исходный код (убрал всё лишнее, чтобы сконцентрироваться на основной задаче):

//+------------------------------------------------------------------+
//|                                                  11111111111.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

input int      TakeProfit=300; //Тейк-профит
input int      StopLoss=250;  //Стоп-лосс
input double   lot=0.1;        //Лот

double Ask;
double Bid;
//+------------------------------------------------------------------+
//| Функция открытия длинной (Long) позиции.                         |
//+------------------------------------------------------------------+
int OpenLong(double volume=0.1,
             int slippage=10,
             string comment="Long",
             int magic=0)
  {
   MqlTradeRequest my_trade;
   MqlTradeResult my_trade_result;
   ZeroMemory(my_trade);
   my_trade.action=TRADE_ACTION_DEAL;
   my_trade.symbol=Symbol();
   my_trade.volume=NormalizeDouble(volume,1);
   my_trade.price=NormalizeDouble(Ask,_Digits);
   my_trade.sl=NormalizeDouble(Ask-StopLoss*_Point,_Digits);
   my_trade.tp=NormalizeDouble(Ask+TakeProfit*_Point,_Digits);
   my_trade.deviation=slippage;
   my_trade.type=ORDER_TYPE_BUY;
   my_trade.type_filling=ORDER_FILLING_FOK;
   my_trade.comment=comment;
   my_trade.magic=magic;
   ResetLastError();

   if(OrderSend(my_trade,my_trade_result))
     {
      Print("Код результата операции - ",my_trade_result.retcode);
     }
   else
     {
      Print("Код результата операции - ",my_trade_result.retcode);
      Print("Ошибка открытия ордера = ",GetLastError());
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| функция открытия короткой (Short) позиции.                       |
//| Аналогична функции открытия длинной позиции.                     |
//+------------------------------------------------------------------+
.
.
.
.
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason){}
//+------------------------------------------------------------------+
//| Expert OnTick function                                           |
//+------------------------------------------------------------------+
void OnTick()
  {
.   double Open[];
.
.
         if(Open[1]>(Open[2]))
           {
            OpenShort(lot,10,"Short",1234);
            return;
           }
         if((Open[1]<Open[2])
           {
            OpenLong(lot,10,"Long",1234);
            cantrade=false;
            return;
           }
        }
     }
   return;
  }
//+------------------------------------------------------------------+

вставил в него код из указанной библиотеки. Получился вот такой код:

//+------------------------------------------------------------------+
//|                                                  11111111111.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

#include <Trade\SymbolInfo.mqh> // добавлено из библиотеки

input int      TakeProfit=300; //Тейк-профит
input int      StopLoss=250;  //Стоп-лосс
input double   lot=0.1;        //Лот
input double   MaximumPercentageRisk=25; //Риск - добавлено из библиотеки

bool UseMaximumPercentageRisk=true; // добавлено из библиотеки
double Ask;
double Bid;
//--- этот блок добавлен из библиотеки
//+------------------------------------------------------------------+
//|  GetLotSize RPTrade                                              |
//+------------------------------------------------------------------+
double GetLotSize(double lotsize)
  {
//--- Gets pair specs  
   CSymbolInfo symInfo;
   int  digits_bn=symInfo.Digits();
   double  points_bn=symInfo.Point();
   string symbol_bn=_Symbol;
//--- adjust lot 
   int tmpdecimal=1;
   double old_lot=lotsize;
//---
   if((NormalizeDouble(AccountInfoDouble(ACCOUNT_FREEMARGIN)*(MaximumPercentageRisk/100)/1000.0,tmpdecimal)<lotsize) 
   && UseMaximumPercentageRisk) //лот подходит под риск ?
     {
      lotsize=NormalizeDouble(AccountInfoDouble(ACCOUNT_FREEMARGIN)
      *(MaximumPercentageRisk/100)/1000.0,tmpdecimal);  //расчет нового размера лота 

      if(lotsize<SymbolInfoDouble(symbol_bn,SYMBOL_VOLUME_MIN)) //размер лота подходит под минимльный размер лота брокера ?
        {
         lotsize=SymbolInfoDouble(symbol_bn,SYMBOL_VOLUME_MIN); //Нет! Настройка размера лота под минимальный размер лота брокера
         Print(_Symbol," Lot adjusted from ",old_lot," для уменьшения размера разрешенного сервером ",lotsize);
        }
      else
        {
         Print(_Symbol," Lot adjusted from ",old_lot,
         " to ",lotsize," для соответствия условию максимального риска. В каждой сделке рисковать можно только ",
         MaximumPercentageRisk,"% от свободной маржи.");   //Да! 
         if(MathAbs(lotsize/SymbolInfoDouble(symbol_bn,SYMBOL_VOLUME_STEP)
         -MathRound(lotsize/SymbolInfoDouble(symbol_bn,SYMBOL_VOLUME_STEP)))>1.0E-10) //Размер лота подходит под разрешенный шаг брокера ?
           {
            lotsize=SymbolInfoDouble(symbol_bn,SYMBOL_VOLUME_STEP)
            *NormalizeDouble(lotsize/SymbolInfoDouble(symbol_bn,SYMBOL_VOLUME_STEP),0);   //НЕТ! Перерасчет размера лота.    
            Print("M-",_Symbol," Warning: Your calculated percentage at risk lot size of was not a multiple of minimal step",
            SymbolInfoDouble(symbol_bn,SYMBOL_VOLUME_STEP),". Размер лота изменился до",lotsize);
           }
        }
     }
   return(lotsize);
 }

//+------------------------------------------------------------------+
//| Функция открытия длинной (Long) позиции.                         |
//+------------------------------------------------------------------+
int OpenLong(double volume=0.1,
             int slippage=10,
             string comment="Long",
             int magic=0)
  {
   MqlTradeRequest my_trade;
   MqlTradeResult my_trade_result;
   ZeroMemory(my_trade);
   my_trade.action=TRADE_ACTION_DEAL;
   my_trade.symbol=Symbol();
   my_trade.volume=NormalizeDouble(volume,1);
   my_trade.price=NormalizeDouble(Ask,_Digits);
   my_trade.sl=NormalizeDouble(Ask-StopLoss*_Point,_Digits);
   my_trade.tp=NormalizeDouble(Ask+TakeProfit*_Point,_Digits);
   my_trade.deviation=slippage;
   my_trade.type=ORDER_TYPE_BUY;
   my_trade.type_filling=ORDER_FILLING_FOK;
   my_trade.comment=comment;
   my_trade.magic=magic;
   ResetLastError();

   if(OrderSend(my_trade,my_trade_result))
     {
      Print("Код результата операции - ",my_trade_result.retcode);
     }
   else
     {
      Print("Код результата операции - ",my_trade_result.retcode);
      Print("Ошибка открытия ордера = ",GetLastError());
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| функция открытия короткой (Short) позиции.                       |
//| Аналогична функции открытия длинной позиции.                     |
//+------------------------------------------------------------------+
.
.
.
.
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason){}
//+------------------------------------------------------------------+
//| Expert OnTick function                                           |
//+------------------------------------------------------------------+
void OnTick()
  {
.   double Open[];
.
.
         if(Open[1]>(Open[2]))
           {
            OpenShort(lot,10,"Short",1234);
            return;
           }
         if((Open[1]<Open[2])
           {
            OpenLong(lot,10,"Long",1234);
            cantrade=false;
            return;
           }
        }
     }
   return;
  }
//+------------------------------------------------------------------+

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

С уважением, Владимир.

Maximum Percentage of Equity Risk
Maximum Percentage of Equity Risk
  • www.mql5.com
Change Chart and Timeframe Модифицированные скрипты для быстрого изменения графиков и таймфреймов на всех графиках при помощи горячих клавиш. Apply Template Простой скрипт для применения шаблона и/или таймфрейма ко всем открытым графикам. Long position Простой скрипт...
 
Господа, изо всей темы обсуждение составляет одну страницу, всё остальное коды. Может достаточно уже просто так вставлять коды?
 
MrBrooklin:

Всем доброго дня!

Пока Роман в командировке и активно не учасвствует в данной ветке, продолжу вместо него задавать вопросы по языку программирования MQL5. Нашел в CodeBase по ссылке https://www.mql5.com/ru/code/2142 библиотеку Maximum Percentage of Equity Risk. Решил попробовать в коде одного простого советника реализовать открытие позиций на покупку и продажу, но только не с фиксированным лотом, а с максимальным процентом риска капитала.

Вот исходный код (убрал всё лишнее, чтобы сконцентрироваться на основной задаче):

вставил в него код из указанной библиотеки. Получился вот такой код:

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

С уважением, Владимир.

Ну так как написано так и работает. Нужна строчка если Lot==0 то считаем рисковый лот и в конце присваиваем переменной Lot значение расчета.

В четверке такой вариант, через дополнительную переменную Lts

bool CheckMoneyForTrade()
 {
 RefreshRates();                              // Обновление данных
   Min_Lot=MarketInfo(Symb,MODE_MINLOT);        // Миним. колич. лотов 
   Free   =AccountFreeMargin();                 // Свободн средства
   One_Lot=MarketInfo(Symb,MODE_MARGINREQUIRED);// Стоимость 1 лота
   Step   =MarketInfo(Symb,MODE_LOTSTEP);       // Шаг изменен размера
 
   if (Lots > 0)                                // Если заданы лоты,то 
      Lts =Lots;                                // с ними и работаем 
   else                                         // % свободных средств
      Lts=MathFloor(Free*Prots/One_Lot/Step)*Step;// Для открытия
 
   if(Lts < Min_Lot) Lts=Min_Lot;               // Не меньше минимальн
   if (Lts*One_Lot > Free)                      // Лот дороже свободн.
     {
      Alert(" Not enough money for ", Lts," lots");
     Work=false;
      return(false) ;                                   // Выход из функции()
     }
     return(true);
     }
 
VVT:
Господа, изо всей темы обсуждение составляет одну страницу, всё остальное коды. Может достаточно уже просто так вставлять коды?

А как же тогда помогать ? 

 
SanAlex:

А как же тогда помогать ? 

Вставлять только то что просят

 
Valeriy Yastremskiy:

Ну так как написано так и работает. Нужна строчка если Lot==0 то считаем рисковый лот и в конце присваиваем переменной Lot значение расчета.

В четверке такой вариант, через дополнительную переменную Lts

Спасибо, Валерий, вечером попробую!

С уважением, Владимир.