Программный код, который создает на текущем графике индикатор 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)");
Теперь осталось понять, как сделать, так чтобы при изменении настроек индикатора, он так же удалялся. Попробавал вот такой вариант:
При таком варианте индикатор удаляется при любых настройках, только вот при компиляции советника редактор пишет 3-и предупреждения о неявном преобразование из числа в строку:
implicit conversion from 'number' to 'string' ZigZag_Fibonacci_(M1).mq5 230 38
Подозреваю, что всё дело в этих значениях: "+Inp_ZZ_Depth+", "+Inp_ZZ_Deviation+","+Inp_ZZ_Backstep+". В общем нужно дальше изучать язык программирования MQL5.
Окончательный код, который создает на текущем графике индикатор 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.
Я сам самоучка - и сам копирую из доступных кодов, - Проблема в том, что я не умею объяснять, как леплю!? - что то внутри подсказывает, как нужно слепить.
----------------------------------
Знаю то что слепил, не хватает туда, еще Трала для линии.
Добавил трал
inputstring t0="---- Trailing Line: -----"; //inputushort InpObjTrailingStop = 0; // Obj: Trailing Stop (distance from price to object, in pips)inputushort InpObjTrailingStep = 0; // Obj: Trailing Step, in pips (1.00045-1.00055=1 pips)inputstring t1="---- Line Name -----"; //inputstring InpObjUpName = "Имя Линии Up"; // Obj: Up (Trailing Horizontal Line) or Trend Line)input ENUM_TRADE_COMMAND InpTradeCommand = UpName_s; // Obj: command: UPinputstring InpObjDownName = "Имя Линии Down"; // Obj: Down (Trailing Horizontal Line) or Trend Line)input ENUM_TRADE_COMMAND InTradeCommand = DownName_b; // Obj: command: DOWNinputushort InpObjStep = 15; // Obj: Step (distance from price to object, in pips)
Ооо, огромное спасибо, с таким колличеством информации можно столько дел наворотить...
Как раз уезжаю в командировку, думаю посильнее углубиться в данные мне материалы, ну а кодить... Можно и на листе, думаю будет неплохая тренировка...
С уважением, Роман
Всем доброго дня!
Пока Роман в командировке и не учавствует в данной ветке, продолжу вместо него задавать вопросы по языку программирования 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"#include <Trade\SymbolInfo.mqh> // добавлено из библиотекиinputint TakeProfit=300; //Тейк-профитinputint StopLoss=250; //Стоп-лоссinputdouble lot=0.1; //Лотinputdouble 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 |//+------------------------------------------------------------------+intOnInit()
{
return(0);
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit(constint reason){}
//+------------------------------------------------------------------+//| Expert OnTick function |//+------------------------------------------------------------------+voidOnTick()
{
. 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;
}
//+------------------------------------------------------------------+
Но советник как работал по фиксированному лоту, так и продолжает работать, т.е. риск не учитывается. Подскажите, пожалуйста, что нужно сделать, чтобы заработал процент риска капиатала.
Change Chart and Timeframe Модифицированные скрипты для быстрого изменения графиков и таймфреймов на всех графиках при помощи горячих клавиш. Apply Template Простой скрипт для применения шаблона и/или таймфрейма ко всем открытым графикам. Long position Простой скрипт...
Пока Роман в командировке и активно не учасвствует в данной ветке, продолжу вместо него задавать вопросы по языку программирования 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);
}
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
ОГРОМНОЕ ВСЕМ СПАСИБО!!!
Программный код, который создает на текущем графике индикатор 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.
Ещё раз всех благодарю за оказанное содействие!!!
С уважением, Владимир.
ОГРОМНОЕ ВСЕМ СПАСИБО!!!
Окончательный код, который создает на текущем графике индикатор 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.
Ещё раз всех благодарю за оказанное содействие!!!
С уважением, Владимир.
Предупреждение на не явное приведение типов. для стрикт (строгого) исполнения не явное приведение дает предупреждение.
Надо явно типы приводить. А в МТ5 всегда строгое исполнение. В МТ4 можно выбрать, и не указать в свойствах #property strict
Я сам самоучка - и сам копирую из доступных кодов, - Проблема в том, что я не умею объяснять, как леплю!? - что то внутри подсказывает, как нужно слепить.
----------------------------------
Знаю то что слепил, не хватает туда, еще Трала для линии.
Добавил трал
Предупреждение на не явное приведение типов. для стрикт (строгого) исполнения не явное приведение дает предупреждение.
Надо явно типы приводить. А в МТ5 всегда строгое исполнение. В МТ4 можно выбрать, и не указать в свойствах #property strict
Вы правы, Валерий! В таком виде всё работает так, как надо. Окончательный вариант в блоке инициализации советника:
в блоке деинициализации советника:
Спасибо за подсказку!
С уважением, Владимир.
Ооо, огромное спасибо, с таким колличеством информации можно столько дел наворотить...
Как раз уезжаю в командировку, думаю посильнее углубиться в данные мне материалы, ну а кодить... Можно и на листе, думаю будет неплохая тренировка...
С уважением, Роман
Всем доброго дня!
Пока Роман в командировке и не учавствует в данной ветке, продолжу вместо него задавать вопросы по языку программирования MQL5. Нашел в CodeBase по ссылке https://www.mql5.com/ru/code/2142 библиотеку Maximum Percentage of Equity Risk. Решил попробовать в коде одного простого советника реализовать открытие позиций на покупку и продажу, но только не с фиксированным лотом, а с максимальным процентом риска капитала.
Вот исходный код (убрал всё лишнее, чтобы сконцентрироваться на основной задаче):
вставил в него код из указанной библиотеки. Получился вот такой код:
Но советник как работал по фиксированному лоту, так и продолжает работать, т.е. риск не учитывается. Подскажите, пожалуйста, что нужно сделать, чтобы заработал процент риска капиатала.
С уважением, Владимир.
Всем доброго дня!
Пока Роман в командировке и активно не учасвствует в данной ветке, продолжу вместо него задавать вопросы по языку программирования MQL5. Нашел в CodeBase по ссылке https://www.mql5.com/ru/code/2142 библиотеку Maximum Percentage of Equity Risk. Решил попробовать в коде одного простого советника реализовать открытие позиций на покупку и продажу, но только не с фиксированным лотом, а с максимальным процентом риска капитала.
Вот исходный код (убрал всё лишнее, чтобы сконцентрироваться на основной задаче):
вставил в него код из указанной библиотеки. Получился вот такой код:
Но советник как работал по фиксированному лоту, так и продолжает работать, т.е. риск не учитывается. Подскажите, пожалуйста, что нужно сделать, чтобы заработал процент риска капиатала.
С уважением, Владимир.
Ну так как написано так и работает. Нужна строчка если Lot==0 то считаем рисковый лот и в конце присваиваем переменной Lot значение расчета.
В четверке такой вариант, через дополнительную переменную Lts
Господа, изо всей темы обсуждение составляет одну страницу, всё остальное коды. Может достаточно уже просто так вставлять коды?
А как же тогда помогать ?
А как же тогда помогать ?
Вставлять только то что просят
Ну так как написано так и работает. Нужна строчка если Lot==0 то считаем рисковый лот и в конце присваиваем переменной Lot значение расчета.
В четверке такой вариант, через дополнительную переменную Lts
Спасибо, Валерий, вечером попробую!
С уважением, Владимир.