Добрый вечер, проблема в том что торгую роботом на терминале mt5 и столкнулся сегодня со следующей ошибкой : 2020.08.12 10:39:01.521 Trendsovrev (SILV-9.20,M5) CTrade::OrderSend: exchange buy 0.00 SILV-9.20 sl: 25.42 tp: 26.47 [invalid volume]
до этого робот торговал без каких либо ошибок и в настройках указан "1" лот а в ошибке почему то "0" . Абсолютно ничего не менял, с чем это связано разобрать не могу. Буду очень признателен если дадите хоть какие то комментарии по данной ошибке и сможете помочь. Заранее спасибо
Исправьте объём в строке 15789.
Исправьте объём в строке 15789.
Не, не в этой строке. Вот я сейчас напряг зрение и вижу, что ошибка в строке 17864.
Исправьте объём в строке 15789.
я так понимаю это намёк на то что для понимания проблемы нужен код робота?
тогда вот
#include <777\777.mqh> // Подключаем торговый класс CTrade input double LT = 1; // лот input double KL = 1; // увеличение лота input double ML = 10; // максимальный лот input int Stop = 200; // стоплосс input int Take = 300; // тейкпрофит input int Slip = 100; // проскальзывание input bool Rev = 0; // true-реверс input string IndName = "111"; input uint = 20; // input double = 2; // input string IndName2 = "2222"; enum enMaTypes { ma_sma, // Simple moving average ma_ema, // Exponential moving average ma_smma, // Smoothed MA ma_lwma // Linear weighted MA }; input int inpMaPeriod = 7; // Smoothing period input enMaTypes inpMaMetod = ma_lwma; // Smoothing method input int inpStep = 0; // Step size input bool inpBetterFormula = false; // Use better formula int RiskHandle=0,HAHandle=0,bars=0; double up[1],dn[1],op[1],cl[1]; CTrade trade; // Используем торговый класс CTrade //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- RiskHandle=iCustom(_Symbol,0,IndName,PeriodBands,Deviation); HAHandle=iCustom(_Symbol,0,IndName2,inpMaPeriod,inpMaMetod,inpStep,inpBetterFormula); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ double Lot() { double lot=LT; if(HistorySelect(0,TimeCurrent())) { double profit=HistoryDealGetDouble(HistoryDealGetTicket(HistoryDealsTotal()-1),DEAL_PROFIT); double LastLot=HistoryDealGetDouble(HistoryDealGetTicket(HistoryDealsTotal()-1),DEAL_VOLUME); if(profit>0) lot=LT; if(profit<0) lot=LastLot*KL; } if(lot>ML) lot=LT; return(lot); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { double sl=0,tp=0; double open=iOpen(NULL,0,1); double close=iClose(NULL,0,1); double Ask=SymbolInfoDouble(_Symbol,SYMBOL_ASK); double Bid=SymbolInfoDouble(_Symbol,SYMBOL_BID); CopyBuffer(RiskHandle,0,1,1,up); CopyBuffer(RiskHandle,1,1,1,dn); CopyBuffer(HAHandle,0,1,1,op); CopyBuffer(HAHandle,3,1,1,cl); bool buy=close>up[0] && open<up[0] && cl[0]>op[0]; bool sell=close<dn[0] && open>dn[0] && cl[0]<op[0]; if(Rev) { buy=close<dn[0] && open>dn[0] && cl[0]<op[0]; sell=close>up[0] && open<up[0] && cl[0]>op[0]; } if(PositionsTotal()<1 && bars!=Bars(NULL,0)) { if(buy) { sl=NormalizeDouble(Bid-Stop*_Point,_Digits); tp=NormalizeDouble(Bid+Take*_Point,_Digits); trade.PositionOpen(_Symbol,0,Lot(),Ask,sl,tp); } if(sell) { sl=NormalizeDouble(Ask+Stop*_Point,_Digits); tp=NormalizeDouble(Ask-Take*_Point,_Digits); trade.PositionOpen(_Symbol,1,Lot(),Bid,sl,tp); } bars=Bars(NULL,0); } Comment("\n UP: ",up[0], "\n DN: ",dn[0], "\n HOP: ",op[0], "\n HCL: ",cl[0]); } //+------------------------------------------------------------------+
Блок проверяет только условие "если больше":
//+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ double Lot() { double lot=LT; if(HistorySelect(0,TimeCurrent())) { double profit=HistoryDealGetDouble(HistoryDealGetTicket(HistoryDealsTotal()-1),DEAL_PROFIT); double LastLot=HistoryDealGetDouble(HistoryDealGetTicket(HistoryDealsTotal()-1),DEAL_VOLUME); if(profit>0) lot=LT; if(profit<0) lot=LastLot*KL; } if(lot>ML) lot=LT; return(lot); }
но нет никакой защиты, для случая, когда "если меньше или равен нулю".
Блок проверяет только условие "если больше":
но нет никакой защиты, для случая, когда "если меньше или равен нулю".
Добрый день, большое спасибо за ответ. Но я не совсем понимаю почему это была причина если лот был в настройках равен "1" ? и до этого дня всё работало. Данного робота писал не я ,а человек этот сейчас на связь не выходит. Правильно ли я понял что для того что бы подобной ошибки больше не было данный кусок кода должен выглядеть следующим образом:
//+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ double Lot() { double lot=LT; if(HistorySelect(0,TimeCurrent())) { double profit=HistoryDealGetDouble(HistoryDealGetTicket(HistoryDealsTotal()-1),DEAL_PROFIT); double LastLot=HistoryDealGetDouble(HistoryDealGetTicket(HistoryDealsTotal()-1),DEAL_VOLUME); if(profit>0) lot=LT; if(profit<0) lot=LastLot*KL; } if(lot>ML) lot=LT; if(lot<ML) lot=LT; return(lot); }
Добрый день, большое спасибо за ответ. Но я не совсем понимаю почему это была причина если лот был в настройках равен "1" ? и до этого дня всё работало. Данного робота писал не я ,а человек этот сейчас на связь не выходит. Правильно ли я понял что для того что бы подобной ошибки больше не было данный кусок кода должен выглядеть следующим образом:
Этот кусок кода вообще лишний - Вы задаёте во входных параметрах постоянный лот.
Этот кусок кода вообще лишний - Вы задаёте во входных параметрах постоянный лот.
Просто как я понимаю этот кусок кода для мартингейла или я не прав? Я правильно понял что должно быть так и тогда этой ошибки не будет? просто не совсем понятно почему она вообще появилась если до этого неделю проблем не было вообще. и количество лотов не менялось. Заранее спасибо за ответ
//+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ double Lot() { double lot=LT; if(HistorySelect(0,TimeCurrent())) { double profit=HistoryDealGetDouble(HistoryDealGetTicket(HistoryDealsTotal()-1),DEAL_PROFIT); double LastLot=HistoryDealGetDouble(HistoryDealGetTicket(HistoryDealsTotal()-1),DEAL_VOLUME); if(profit>0) lot=LT; if(profit<0) lot=LastLot*KL; } return(lot); }
Просто как я понимаю этот кусок кода для мартингейла или я не прав? Я правильно понял что должно быть так и тогда этой ошибки не будет? просто не совсем понятно почему она вообще появилась если до этого неделю проблем не было вообще. и количество лотов не менялось. Заранее спасибо за ответ
А у Вас есть мартингейл?
Этот кусок кода вообще лишний - Вы задаёте во входных параметрах постоянный лот.
Тут похоже на мартингейл. Если последняя сделка с профитом то объем не меняется. Если был убыток, то в новой сделке объем равен объему в последней сделке умноженному на KL. Далее проверяется если получившийся объем больше максимального (ML) то новый объем устанавливается равным LT (начальному объему).
По идее должно все работать. Я подозреваю, что в параметрах эксперта значение KL установлено равным нулю. Тогда получается, если была убыточная сделка
if(profit<0) lot=LastLot*KL; А так как KL = 0 то в итоге объем будет равный нулю.
...
В общем примитивный код. Такой только на демо гонять. Интересно сколько человек заплатил за такую поделку.
Тут похоже на мартингейл. Если последняя сделка с профитом то объем не меняется. Если был убыток, то в новой сделке объем равен объему в последней сделке умноженному на KL. Далее проверяется если получившийся объем больше максимального (ML) то новый объем устанавливается равным LT (начальному объему).
По идее должно все работать. Я подозреваю, что в параметрах эксперта значение KL установлено равным нулю. Тогда получается, если была убыточная сделка
if(profit<0) lot=LastLot*KL; А так как KL = 0 то в итоге объем будет равный нулю.
Это на словах якобы будет работать. На самом деле:
1. Не нужно качать всю истории сделок от сотворения мира до сего дня
2. Нужно обязательно проверять ТИП сделки (BUY или SELL), ТИП ВХОДА/ВЫХОДА в рынок.
3. После увеличения лота ОБЯЗАТЕЛЬНО проверить корректность лота - полученный лот должен соответствовать шагу лота, не должен быть больше максимума или меньше минимума
4. ...

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Добрый вечер, проблема в том что торгую роботом на терминале mt5 и столкнулся сегодня со следующей ошибкой : 2020.08.12 10:39:01.521 Trendsovrev (SILV-9.20,M5) CTrade::OrderSend: exchange buy 0.00 SILV-9.20 sl: 25.42 tp: 26.47 [invalid volume]
до этого робот торговал без каких либо ошибок и в настройках указан "1" лот а в ошибке почему то "0" . Абсолютно ничего не менял, с чем это связано разобрать не могу. Буду очень признателен если дадите хоть какие то комментарии по данной ошибке и сможете помочь. Заранее спасибо