错误、漏洞、问题 - 页 958 1...951952953954955956957958959960961962963964965...3184 新评论 Anatoli Kazharski 2013.04.11 08:13 #9571 antt:传递不同的输入参数。符号、周期、输入参数相同,指标也相同。终端试图将资源消耗降到最低,在这种情况下,不会创建一个新的指标副本,也就是说,实际上只有一个mql5程序在工作。请对这个简单的问题也提出建议:https://www.mql5.com/ru/forum/1111/page975#comment_469324 , 因为没有人知道。))) Alexandr Gavrilin 2013.04.11 08:28 #9572 请帮助我纠正它。在策略测试器中,一切都工作得很好,但在M1的RTS演示中,有时不是3手的头寸,而是发送2个各3手的订单,总头寸为6手。#property copyright "Copyright 2013, DKeN" #property link "" #property version "1.00" /* 1 Название: Параболик 2 Терминал: МТ5 3 Рабочий инструмент: любой инструмент и период 4 Индикатор: параболик 5 Правила: при пересечение входим в направлении пересечения по рынку , профит делим на 3 части , при закрытие первого выставляем стоп в ноль или чуть в плюс, если профит не достигнут, а цена ушла в минус переворачиваем позицию при пересечении параболика… 6 второй вариант: при пересечение входим в направлении пересечения по рынку , профит делим на 2 части , при закрытие первой части вторую оставляем до пересечения параболика 7 настройки: а) к-во лотов б) индикатор в) время работы 8. возможность работы по нескольким инструментам на одном счете если торгуем на РТС необходимо строго со спецификацией инструмента данные задавать! */ input string comment=""; //комментарий к ордеру input int slippage=10; //проскальзывание input double lot=3; //рабочий лот позиции input int takeprofit=200; //тейк профит основной позиции input int stoploss=1000; //стоп лосс основной позиции input int mode=1; /*режим выхода 1 или 2*/ input int takeprofit1=100; //точка закрытия первой части профита в пунктах input double lot1=1; //объем закрываемой части ордера input double bu1=10; //для режима 1, пренос в безубыток +1 input int takeprofit2=150; //точка закрытия второй части профита в пунктах input double lot2=1; //объем закрываемой позиции input ENUM_TIMEFRAMES tf=0; //период, 0 - по умолчанию с графика текущий input double step=0.02; input double maximum=0.2; //настрйоки для сар step,maximum input string times="00:00-24:00"; //поддерживаются интервалы через , например 00:00-12:00, 16:00-20:00 и т.д. поддержка ночного перехода например 22:00-05:00 //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int psar=-1; ulong semafor=0; int OnInit() { //--- psar=iSAR(NULL,tf,step,maximum); if(psar==INVALID_HANDLE){ PrintFormat("Не удалось создать хэндл индикатора iSAR для пары %s/%s, код ошибки %d", _Symbol, EnumToString(_Period),GetLastError()); return (-1); } semafor=0; //--- return(0); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- if(psar!=INVALID_HANDLE) IndicatorRelease(psar); Comment(""); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- bool bWork=time_check(times); Comment("Торговый интервал времени"); if(!bWork)Comment("Неторговый интервал времени. Разрешено закрытие по обратному сигналу и частичное закрытие. Открытие новых сделок запрещено."); double sar[],dLot,open,stop,take; ENUM_POSITION_TYPE type; ArraySetAsSeries(sar,true); string n=_Symbol; if(CopyBuffer(psar,0,0,2,sar)>=0){ //1 - предыдущее значение //0 - текущий бар MqlRates rates[]; MqlTick tick; ArraySetAsSeries(rates,true); int op=0; if(CopyRates(NULL,tf,0,2,rates)>0){ if(SymbolInfoTick(n,tick)){ if(tick.bid<sar[1] && sar[1]<rates[0].open) op=-1; else if(tick.ask>sar[1] && sar[1]>rates[0].open) op=1; } //првоерим если позиции в рынке нет, попробуем открыть по сигналу if(!PositionSelect(n)) { order_OrderDeleteAll(n); //удалим отложки if(op==0) return; //сигнала нет! if(bWork){ if(op==1) order_OrderSend(n,ORDER_TYPE_BUY,lot,0,stoploss,takeprofit,comment); if(op==-1) order_OrderSend(n,ORDER_TYPE_SELL,lot,0,stoploss,takeprofit,comment); } }else{ type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); dLot=PositionGetDouble(POSITION_VOLUME); if(dLot==lot){ int orders[]; int all=order_OrdersTotal(n,orders); open=PositionGetDouble(POSITION_PRICE_OPEN); if(type==POSITION_TYPE_BUY && orders[ORDER_TYPE_SELL_LIMIT]==0){ if(mode==2 || mode==1)order_OrderSend(n,ORDER_TYPE_SELL_LIMIT,lot1,open+takeprofit1*_Point,0,0,""); if(mode==1)order_OrderSend(n,ORDER_TYPE_SELL_LIMIT,lot2,open+takeprofit2*_Point,0,0,""); } if(type==POSITION_TYPE_SELL && orders[ORDER_TYPE_BUY_LIMIT]==0){ if(mode==2 || mode==1)order_OrderSend(n,ORDER_TYPE_BUY_LIMIT,lot1,open-takeprofit1*_Point,0,0,""); if(mode==1)order_OrderSend(n,ORDER_TYPE_BUY_LIMIT,lot2,open-takeprofit2*_Point,0,0,""); } }else if(dLot<lot && mode==1){ open=PositionGetDouble(POSITION_PRICE_OPEN); stop=PositionGetDouble(POSITION_SL); take=PositionGetDouble(POSITION_TP); if(type==POSITION_TYPE_BUY && (stop<open || stop==0.0)) order_OrderModify(n,open+bu1*_Point,take); if(type==POSITION_TYPE_SELL && (stop>open || stop==0.0)) order_OrderModify(n,open-bu1*_Point,take); } //Print(GetLastError()," op=",op," type=",type); if(op==0) return; //позиция к этому моменту могла быть уже закрыта, перепроверим и проверим ее лот и тип if(PositionSelect(n)){ type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); dLot=PositionGetDouble(POSITION_VOLUME); //осуществим переворот, да так чтобы закрыть остаток и открыть начальным лотом if(type==POSITION_TYPE_BUY && op==-1) { order_OrderDeleteAll(n); //удалим отложки order_OrderSend(n,ORDER_TYPE_SELL,dLot,0,0,0,comment); }else if(type==POSITION_TYPE_SELL && op==1) { order_OrderDeleteAll(n); //удалим отложки order_OrderSend(n,ORDER_TYPE_BUY,dLot,0,0,0,comment); } } } } } } //+------------------------------------------------------------------+ bool order_OrderModify(string name,double sl,double tp){ /* SL & TP Modification Торговый приказ на модификацию уровней StopLoss и/или TakeProfit. Требуется указание 4 полей: action symbol sl tp */ MqlTradeRequest rq={0}; // структура запроса MqlTradeResult rs={0}; rq.action=TRADE_ACTION_SLTP; rq.symbol=name; rq.sl=sl; rq.tp=tp; return (OrderSend(rq,rs)); } bool order_OrderSend(string name,ENUM_ORDER_TYPE type,double dlot,double open,double sl,double tp,string cmt){ MqlTradeRequest rq={0}; // структура запроса MqlTradeResult rs={0}; MqlTick tick={0}; MqlTradeCheckResult cr={0}; if(PositionSelect(name)) semafor=0; if(semafor>0) return (false); if(type==ORDER_TYPE_BUY || type==ORDER_TYPE_SELL){ rq.action=TRADE_ACTION_DEAL; rq.symbol=name; rq.volume=NLot(name,dlot); rq.type=type; bool ntick=SymbolInfoTick(name,tick); if(open<=0){ if(type==ORDER_TYPE_BUY) rq.price=tick.ask; else if(type==ORDER_TYPE_SELL) rq.price=tick.bid; }else{ rq.price=open; //если цена указана явно, то откроем по цене+проскальзывание } rq.sl=0; rq.tp=0; //выставим стоп if(sl>0 && type==ORDER_TYPE_BUY) rq.sl=NormalizeDouble(rq.price-sl*_Point,_Digits); else if(sl>0 && type==ORDER_TYPE_SELL) rq.sl=NormalizeDouble(rq.price+sl*_Point,_Digits); //выставим тейк if(tp>0 && type==ORDER_TYPE_BUY) rq.tp=NormalizeDouble(rq.price+tp*_Point,_Digits); else if(tp>0 && type==ORDER_TYPE_SELL) rq.tp=NormalizeDouble(rq.price-tp*_Point,_Digits); rq.deviation=slippage;//допустимое проскальзывание rq.type_filling=ORDER_FILLING_FOK; rq.comment=cmt; }else{ rq.action=TRADE_ACTION_PENDING; rq.symbol=name; rq.volume=NLot(name,dlot); rq.type=type; rq.deviation=slippage;//допустимое проскальзывание rq.type_time=ORDER_TIME_DAY; //ORDER_TIME_GTC; //ордер будет до снятия его программно или вручную //bool ntick=SymbolInfoTick(name,tick); rq.price=open; rq.sl=sl; //должна быть ценой! rq.tp=tp; rq.type_filling=ORDER_FILLING_RETURN; rq.comment=cmt; } if(OrderCheck(rq,cr)){ if(OrderSend(rq,rs)){ if(rs.retcode!=TRADE_RETCODE_DONE && rs.retcode!=TRADE_RETCODE_PLACED){ Comment("Debug: order_OrderSend(retcode=",ResultRetcodeDescription(cr.retcode),")"); } semafor=rs.deal; if(rs.retcode==TRADE_RETCODE_DONE || rs.retcode==TRADE_RETCODE_PLACED){ if(type==ORDER_TYPE_BUY || type==ORDER_TYPE_SELL){ rq.action= TRADE_ACTION_SLTP; rq.order= rs.order; return (OrderSend(rq,rs)); } } return (true); } }else{ semafor=0; Comment("Debug: order_OrderSend(retcode=",ResultRetcodeDescription(cr.retcode),")"); } return (false); } /*удаляет отложки*/ bool order_OrderDeleteAll(string name){ ulong ticket; MqlTradeRequest rq={0}; MqlTradeResult rs={0}; for(int i=OrdersTotal()-1;i>=0;i--){ if((ticket=OrderGetTicket(i))>0){ ZeroMemory(rq); ZeroMemory(rs); rq.action=TRADE_ACTION_REMOVE; rq.order=ticket; OrderSend(rq,rs); } } return (false); } int order_OrdersTotal(string name,int &orders[]){ ulong ticket; int total=0; ArrayResize(orders,10,0); ArrayInitialize(orders,0); //--- пройдем по всем отложенным ордерам for(int i=OrdersTotal()-1;i>=0;i--) if((ticket=OrderGetTicket(i))>0) if(OrderGetString(ORDER_SYMBOL)==name){ orders[(int)OrderGetInteger(ORDER_TYPE)]++; total++; } //--- return(total); } //+------------------------------------------------------------------+ //| возврат стрингового результата торговой операции по его коду | //+------------------------------------------------------------------+ string ResultRetcodeDescription(int retcode) { string str; //---- switch(retcode) { case TRADE_RETCODE_REQUOTE: str="Реквота"; break; case TRADE_RETCODE_REJECT: str="Запрос отвергнут"; break; case TRADE_RETCODE_CANCEL: str="Запрос отменен трейдером"; break; case TRADE_RETCODE_PLACED: str="Ордер размещен"; break; case TRADE_RETCODE_DONE: str="Заявка выполнена"; break; case TRADE_RETCODE_DONE_PARTIAL: str="Заявка выполнена частично"; break; case TRADE_RETCODE_ERROR: str="Ошибка обработки запроса"; break; case TRADE_RETCODE_TIMEOUT: str="Запрос отменен по истечению времени";break; case TRADE_RETCODE_INVALID: str="Неправильный запрос"; break; case TRADE_RETCODE_INVALID_VOLUME: str="Неправильный объем в запросе"; break; case TRADE_RETCODE_INVALID_PRICE: str="Неправильная цена в запросе"; break; case TRADE_RETCODE_INVALID_STOPS: str="Неправильные стопы в запросе"; break; case TRADE_RETCODE_TRADE_DISABLED: str="Торговля запрещена"; break; case TRADE_RETCODE_MARKET_CLOSED: str="Рынок закрыт"; break; case TRADE_RETCODE_NO_MONEY: str="Нет достаточных денежных средств для выполнения запроса"; break; case TRADE_RETCODE_PRICE_CHANGED: str="Цены изменились"; break; case TRADE_RETCODE_PRICE_OFF: str="Отсутствуют котировки для обработки запроса"; break; case TRADE_RETCODE_INVALID_EXPIRATION: str="Неверная дата истечения ордера в запросе"; break; case TRADE_RETCODE_ORDER_CHANGED: str="Состояние ордера изменилось"; break; case TRADE_RETCODE_TOO_MANY_REQUESTS: str="Слишком частые запросы"; break; case TRADE_RETCODE_NO_CHANGES: str="В запросе нет изменений"; break; case TRADE_RETCODE_SERVER_DISABLES_AT: str="Автотрейдинг запрещен сервером"; break; case TRADE_RETCODE_CLIENT_DISABLES_AT: str="Автотрейдинг запрещен клиентским терминалом"; break; case TRADE_RETCODE_LOCKED: str="Запрос заблокирован для обработки"; break; case TRADE_RETCODE_FROZEN: str="Ордер или позиция заморожены"; break; case TRADE_RETCODE_INVALID_FILL: str="Указан неподдерживаемый тип исполнения ордера по остатку "; break; case TRADE_RETCODE_CONNECTION: str="Нет соединения с торговым сервером"; break; case TRADE_RETCODE_ONLY_REAL: str="Операция разрешена только для реальных счетов"; break; case TRADE_RETCODE_LIMIT_ORDERS: str="Достигнут лимит на количество отложенных ордеров"; break; case TRADE_RETCODE_LIMIT_VOLUME: str="Достигнут лимит на объем ордеров и позиций для данного символа"; break; default: str="Неизвестный результат"; } //---- return(str); } double NLot(string name,double dlot){ double stepLot=SymbolInfoDouble(name,SYMBOL_VOLUME_STEP); return (MathFloor(dlot/stepLot)*stepLot); } bool time_check(string timeList){ //разделим строку на подстроки (разделитель , ) ushort usep1=StringGetCharacter(",",0); ushort usep2=StringGetCharacter("-",0); ushort usep3=StringGetCharacter(":",0); string param[],param2[],param3[],param4[]; long start_hour=0,start_minute=0,start_seconds=0; long end_hour=0,end_minute=0,end_seconds=0; datetime start_tm=0,end_tm=0,tm[]; ArrayInitialize(tm,0); ArraySetAsSeries(tm,true); CopyTime(_Symbol,PERIOD_D1,0,2,tm); MqlDateTime dt={0}; TimeToStruct(TimeCurrent(),dt); int c=StringSplit(timeList,usep1,param); if(c<0) return (true);//диапозон не задан, можно торговать весь день for(int i=0;i<c;i++){ StringTrimRight(param[i]); StringTrimLeft(param[i]); if(StringSplit(param[i],usep2,param2)==2){ StringTrimRight(param2[0]); StringTrimLeft(param2[0]); StringTrimRight(param2[1]); StringTrimLeft(param2[1]); //удалили возможные лишние пробелы, теперь у нас есть время начала и окончания //разделим на чч.мм.сс if(StringSplit(param2[0],usep3,param3)>=1){ //время начала start_hour=StringToInteger(param3[0]); if(ArraySize(param3)>=2) start_minute=StringToInteger(param3[1]); if(ArraySize(param3)==3) start_seconds=StringToInteger(param3[2]); } if(StringSplit(param2[1],usep3,param4)>=1){ //время окончания end_hour=StringToInteger(param4[0]); if(ArraySize(param4)>=2) end_minute=StringToInteger(param4[1]); if(ArraySize(param4)==3) end_seconds=StringToInteger(param4[2]); } if(start_hour<=end_hour){ start_tm=(datetime)(tm[0]+start_hour*3600+start_minute*60+start_seconds); end_tm=(datetime)(tm[0]+end_hour*3600+end_minute*60+end_seconds); }else{ if(dt.hour>=0 && dt.hour<start_hour){ start_tm=(datetime)(tm[1]+start_hour*3600+start_minute*60+start_seconds); end_tm=(datetime)(tm[0]+end_hour*3600+end_minute*60+end_seconds); } if(dt.hour>0 && dt.hour>=start_hour){ start_tm=(datetime)(tm[0]+start_hour*3600+start_minute*60+start_seconds); end_tm=(datetime)(tm[0]+24*3600+end_hour*3600+end_minute*60+end_seconds); } } if(TimeCurrent()>=start_tm && TimeCurrent()<=end_tm) return (true); } } return (false); } void OnTrade(){ if(semafor>0){ PrintFormat("Открыт ордер %d",semafor); semafor=0; //сбросим семафор, операция с ордером завершаена, можно открывать следующий ордер } } Vasiliy Smirnov 2013.04.11 08:39 #9573 可能这是一个错误)当启动MT5时,与MT4不同,在没有连接到服务器 的情况下启动,最后一次授权(登录/密码)由于某种原因没有加载,需要重新授权,在这种情况下密码和登录不被保存。可能是什么问题? Valerii Mazurenko 2013.04.11 09:50 #9574 这就是该技术所带来的--同一账户在同一时间的不同利润(这是一个休息日,报价、进价、掉期--重合,只是利润不重合)。唯一不同的是,在第一张图片中,终端通过投资密码登录,优化正在运行;第二张图片显示通过交易密码登录。甚至在重新启动和更新终端后,一切都没有变化。当报价单进来时,一切似乎都正常了 Rashid Umarov 2013.04.11 10:08 #9575 notused:这就是技术的结果--同一账户在同一时间有不同的利润(这是一个休息日,报价、进场价格、掉期--都是重合的,只是利润不重合)。唯一不同的是,在第一张图片中,终端通过投资密码登录,优化正在运行;第二张图片显示通过交易密码登录。甚至在重新启动和更新终端后,一切都没有变化。当报价单进来时,一切似乎都正常了 显然,用于计算 浮动利润的终端的 交叉利率 是不同的。 Valerii Mazurenko 2013.04.11 10:24 #9576 Rosh: 显然,码头可 用于计算浮动利润的交叉利率 是不同的。 这在我身上发生过一次,可能永远不会再发生。也就是说,它根本就不是关键。这就是为什么我没有写信给服务台。我只是想让你知道,利润/亏损的计算 程序并不完美(例如,为什么交叉利率会不同?) Документация по MQL5: Торговые функции / OrderCalcProfit www.mql5.com Торговые функции / OrderCalcProfit - Документация по MQL5 Artoym 2013.04.11 11:59 #9577 每隔两分钟,它就会在交易信号上发出这 "一组 "错误。如何解决这个问题? Artoym 2013.04.11 12:02 #9578 或者我可以到哪里去寻找交易信号错误? Yedelkin 2013.04.11 13:53 #9579 kharti: 或者我可以在哪里联系有关交易信号错误的问题? ServiceDesk(在你的个人资料中)。 Pavel Tsatsenko 2013.04.12 01:55 #9580 antt:传递不同的输入参数。符号、周期、输入参数都一样,指标也一样。终端试图最大限度地减少资源消耗,在这种情况下,不会创建一个新的指标副本,也就是说,一个mql5程序实际工作。 我理解并记住了资源消耗的优化,但也许与符号、周期、输入参数一起,我们还应该检查指标的短名称?如果程序员明确设置了一个独特的 简称,他就明白自己在做什么,他需要一个单独的副本,即使这个指标已经存在于图表中。例如,该指标完全没有输入数据,它在初始阶段自动计算所有初始数据,但我们必须强迫用户输入一个假参数并记住它,以便不在另一个参数中输入。 1...951952953954955956957958959960961962963964965...3184 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
传递不同的输入参数。符号、周期、输入参数相同,指标也相同。终端试图将资源消耗降到最低,在这种情况下,不会创建一个新的指标副本,也就是说,实际上只有一个mql5程序在工作。
请对这个简单的问题也提出建议:https://www.mql5.com/ru/forum/1111/page975#comment_469324 , 因为没有人知道。)))
请帮助我纠正它。在策略测试器中,一切都工作得很好,但在M1的RTS演示中,有时不是3手的头寸,而是发送2个各3手的订单,总头寸为6手。
这就是该技术所带来的
--同一账户在同一时间的不同利润(这是一个休息日,报价、进价、掉期--重合,只是利润不重合)。
唯一不同的是,在第一张图片中,终端通过投资密码登录,优化正在运行;第二张图片显示通过交易密码登录。甚至在重新启动和更新终端后,一切都没有变化。当报价单进来时,一切似乎都正常了
这就是技术的结果--同一账户在同一时间有不同的利润(这是一个休息日,报价、进场价格、掉期--都是重合的,只是利润不重合)。
唯一不同的是,在第一张图片中,终端通过投资密码登录,优化正在运行;第二张图片显示通过交易密码登录。甚至在重新启动和更新终端后,一切都没有变化。当报价单进来时,一切似乎都正常了
显然,码头可 用于计算浮动利润的交叉利率 是不同的。
每隔两分钟,它就会在交易信号上发出这 "一组 "错误。如何解决这个问题?
传递不同的输入参数。符号、周期、输入参数都一样,指标也一样。终端试图最大限度地减少资源消耗,在这种情况下,不会创建一个新的指标副本,也就是说,一个mql5程序实际工作。