在测试器中拖放SL和TP。 - 页 12 1...567891011121314 新评论 khorosh 2016.02.17 11:44 #111 Andrey Khatimlianskii:吹牛?)要么展示代码,要么关闭这个主题。 代码是散乱的。部分是在专家顾问中,部分是在指标中。我不会公布整个专家顾问和指标。如果你对某个部分感兴趣,我可以把它贴出来。请让我知道你到底需要什么。 Andrey Khatimlianskii 2016.02.17 11:47 #112 khorosh: 代码是散乱的。部分是在专家顾问中,部分是在指标中。我不会公布整个专家顾问和指标。如果你对某个部分感兴趣,我可以把它摆出来。请说明你到底需要什么。我只是不明白,如果你的问题已经解决了,而我们其他人却没有从讨论中得到什么,你为什么还要维持一个主题。建议增加建设性的 ) khorosh 2016.02.17 12:30 #113 Andrey Khatimlianskii:我只是不明白,如果你的问题已经解决了,而我们其他人却没有从讨论中得到什么,你为什么还要维持一个主题。建议增加一些建设性 )好的,你明白了 )我正在发布关于拖放SL的所有信息。对于TP,我到目前为止还没有做,还不是特别需要。但通过类比的方式来做,并不是什么问题。我把指标的全部内容粘贴出来了。 我从EA中提取了所有关于拖动SL的内容。我没有研究过语言的创新,我做很多事情都是用老办法,所以不要评判。指标代码。//+------------------------------------------------------------------+ //| Test_ChartXYToTimePrice.mq4 | //| Copyright 2016, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "khorosh" #property link "https://www.mql5.com" #property version "1.00" #property strict #property indicator_chart_window //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- indicator buffers mapping if(!GlobalVariableCheck(GetNameTF(Period())+" "+Symbol()+" ModifySL")) { GlobalVariableSet(GetNameTF(Period())+" "+Symbol()+" ModifySL", 0.0); } ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,1); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { //--- //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+ //| ChartEvent function | //+------------------------------------------------------------------+ void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) { //--- if(id==CHARTEVENT_MOUSE_MOVE && IsTesting()) { if(MouseState((uint)sparam)=="DN") { //--- подготовим переменные int x =(int)lparam; int y =(int)dparam; datetime dt =0; double price =0; int window=0; //--- преобразуем координаты X и Y в терминах дата/время if(ChartXYToTimePrice(0,x,y,window,dt,price)) //--- сделаем обратное преобразование: (X,Y) => (Time,Price) if(ChartTimePriceToXY(0,window,dt,price,x,y)) { GlobalVariableSet(GetNameTF(Period())+" "+Symbol()+" ModifySL", StringToDouble(price)); } else Print("ChartTimePriceToXY return error code: ",GetLastError()); } else Print("ChartXYToTimePrice return error code: ",GetLastError()); Print("+--------------------------------------------------------------+"); } if(MouseState((uint)sparam)=="UP") {GlobalVariableSet(GetNameTF(Period())+" "+Symbol()+" ModifySL", 0.0);} } } string MouseState(uint state) { string res; res+=(((state& 1)== 1)?"DN":"UP"); // mouse left return(res); } //+----------------------------------------------------------------------------+ //| Возвращает наименование таймфрейма | //+----------------------------------------------------------------------------+ string GetNameTF(int TimeFrame) { switch (TimeFrame) { case PERIOD_M1: return("M1"); case PERIOD_M5: return("M5"); case PERIOD_M15: return("M15"); case PERIOD_M30: return("M30"); case PERIOD_H1: return("H1"); case PERIOD_H4: return("H4"); case PERIOD_D1: return("Daily"); case PERIOD_W1: return("Weekly"); case PERIOD_MN1: return("Monthly"); default: return("UnknownPeriod"); } } 来自EA的作品。double PriceModifySL = 0.0; int TicketModifSlOrder = 0; int StopLevel = 0; void OnTick() { //--- StopLevel=MarketInfo(Symbol(),MODE_STOPLEVEL); if(IsTesting()) {PriceModifySL = GlobalVariableGet(GetNameTF(Period())+" "+Symbol()+" ModifySL");} else {PriceModifySL=0;} if(PriceModifySL==0.0) {TicketModifSlOrder=0;} if(IsTesting() && PriceModifySL>0.0001) {ModifYSL(PriceModifySL);} //--- } //================================================================================================================================+ // ФУНКЦИИ | //================================================================================================================================+ void ModifYSL(double priceModifySL=0) { double sl=0; if(TicketModifSlOrder==0) { for(int i=0; i<OrdersTotal(); i++) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) { if(MathAbs(OrderStopLoss()-priceModifySL)<20*Point) { TicketModifSlOrder=OrderTicket(); break; } } } } } if(TicketModifSlOrder==0) { for(int i=0; i<OrdersTotal(); i++) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) { if(MathAbs(OrderOpenPrice()-priceModifySL)<30*Point) { TicketModifSlOrder=OrderTicket(); break; } } } } } if(OrderSelect(TicketModifSlOrder, SELECT_BY_TICKET)) { sl=priceModifySL; if(MathAbs(sl-Ask)>StopLevel*Point() && MathAbs(sl-Bid)>StopLevel*Point()) { ModifyOrder1(-1, sl, -1, 0); } } } //=================================================================================================================================//+----------------------------------------------------------------------------+ //| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru | //+----------------------------------------------------------------------------+ //| Версия : 28.11.2006 | //| Описание : Модификация одного предварительно выбранного ордера. | //+----------------------------------------------------------------------------+ //| Параметры: | //| pp - цена установки ордера | //| sl - ценовой уровень стопа | //| tp - ценовой уровень тейка | //| ex - дата истечения | //+----------------------------------------------------------------------------+ void ModifyOrder1(double pp=-1, double sl=0, double tp=0, datetime ex=0) { bool fm; color cl=IIFc(OrderType()==OP_BUY || OrderType()==OP_BUYLIMIT || OrderType()==OP_BUYSTOP, clModifyBuy, clModifySell); double op, pa, pb, os, ot; int dg=MarketInfo(OrderSymbol(), MODE_DIGITS), er, it; if (pp<=0) pp=OrderOpenPrice(); if (sl<0 ) sl=OrderStopLoss(); if (tp<0 ) tp=OrderTakeProfit(); pp=NormalizeDouble(pp, dg); sl=NormalizeDouble(sl, dg); tp=NormalizeDouble(tp, dg); op=NormalizeDouble(OrderOpenPrice() , dg); os=NormalizeDouble(OrderStopLoss() , dg); ot=NormalizeDouble(OrderTakeProfit(), dg); if (pp!=op || sl!=os || tp!=ot) { for (it=1; it<=NumberOfTry; it++) { if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break; while (!IsTradeAllowed()) Sleep(5000); RefreshRates(); fm=OrderModify(OrderTicket(), pp, sl, tp, ex, cl); if (fm) { PlaySound("wait.wav"); break; } else { er=GetLastError(); PlaySound("timeout.wav"); pa=MarketInfo(OrderSymbol(), MODE_ASK); pb=MarketInfo(OrderSymbol(), MODE_BID); Print("Error(",er,") modifying order: ",ErrorDescription(er),", try ",it); Print("Ask=",pa," Bid=",pb," sy=",OrderSymbol(), " op="+GetNameOP(OrderType())," pp=",pp," sl=",sl," tp=",tp); Sleep(1000*10); } } } } Andrey Khatimlianskii 2016.02.17 12:41 #114 khorosh:我还没有做TP,我还不是特别需要它。这就是为什么有可能把开盘价 拉高,并把SL放在利润中;)谢谢你的建设性反馈。 khorosh 2016.02.17 12:49 #115 Andrey Khatimlianskii:因此,有机会将开盘价 拉高,并将SL放入利润中;)谢谢你的建设性反馈。 这与takeprofit有什么关系? Artyom Trishkin 2016.02.17 13:48 #116 khorosh: 这与takeprofit有什么关系? 而当同样的东西被添加到TP时,我们将如何理解到底要修改什么? khorosh 2016.02.17 14:13 #117 你还应该给ModifYSL(double priceModifySL=0)函数添加一个条件,以防万一。正如他们所说,你不能用黄油糟蹋很多粥)。... if(TicketModifSlOrder>0) // Вот это!!! { if(OrderSelect(TicketModifSlOrder, SELECT_BY_TICKET)) { sl=priceModifySL; if(MathAbs(sl-Ask)>StopLevel*Point() && MathAbs(sl-Bid)>StopLevel*Point()) { ModifyOrder1(-1, sl, -1, 0); } } } Artyom Trishkin 2016.02.17 14:16 #118 khorosh: 我们需要引入另一个全局变量 来修改TR。我把这个全局变量称为"ModifySL " 是有原因的。然后是GV的 "ModifyTP"。 是的,这很清楚。我的意思是:如果订单没有止损,我们可以拖动订单本身的线条,止损将被设置在我们 "拖动 "线条的地方。如果我们没有外卖处理,就会出现这种情况。如果我们对止损点和脚趾都进行了处理,但订单两者都没有,那么如果我们绘制订单线,我们应该设置什么?是采取还是停止? khorosh 2016.02.17 14:21 #119 Artyom Trishkin: 是的,我可以看到。我的意思是:如果订单没有止损,我们可以拖动订单本身的线条,止损将被放置在我们 "拖动 "线条的地方。如果我们没有外卖处理,就会出现这种情况。如果我们对止损点和脚趾都进行了处理,但订单两者都没有,那么如果我们绘制订单线,我们应该设置什么?采取还是停止? 我明白了。那么我们应该添加按钮来设置修改类型,或者按照我们在真实图表上的方式来做。我们应该设定订单价格运动的初始方向,以确定TP或SL应该采取什么措施。我一开始没有想到这一点,因为这对我来说不太重要,在我的手动测试策略的EA中,下单时立即设置SL和TP。你说得很有道理。谢谢你,我会牢记这一点。 Artyom Trishkin 2016.02.17 14:27 #120 khorosh: 明白了。然后,要么制作额外的按钮来设置修改类型,要么按照真实图表上的方式来做。从订单价格的初始运动方向来决定TP或SL应该拉到什么位置。 或者我们可以把它与键盘按钮结合起来;) 1...567891011121314 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
吹牛?)
要么展示代码,要么关闭这个主题。
代码是散乱的。部分是在专家顾问中,部分是在指标中。我不会公布整个专家顾问和指标。如果你对某个部分感兴趣,我可以把它摆出来。请说明你到底需要什么。
我只是不明白,如果你的问题已经解决了,而我们其他人却没有从讨论中得到什么,你为什么还要维持一个主题。
建议增加建设性的 )
我只是不明白,如果你的问题已经解决了,而我们其他人却没有从讨论中得到什么,你为什么还要维持一个主题。
建议增加一些建设性 )
好的,你明白了 )我正在发布关于拖放SL的所有信息。对于TP,我到目前为止还没有做,还不是特别需要。但通过类比的方式来做,并不是什么问题。我把指标的全部内容粘贴出来了。 我从EA中提取了所有关于拖动SL的内容。我没有研究过语言的创新,我做很多事情都是用老办法,所以不要评判。
指标代码。
来自EA的作品。
//+----------------------------------------------------------------------------+ //| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru | //+----------------------------------------------------------------------------+ //| Версия : 28.11.2006 | //| Описание : Модификация одного предварительно выбранного ордера. | //+----------------------------------------------------------------------------+ //| Параметры: | //| pp - цена установки ордера | //| sl - ценовой уровень стопа | //| tp - ценовой уровень тейка | //| ex - дата истечения | //+----------------------------------------------------------------------------+ void ModifyOrder1(double pp=-1, double sl=0, double tp=0, datetime ex=0) { bool fm; color cl=IIFc(OrderType()==OP_BUY || OrderType()==OP_BUYLIMIT || OrderType()==OP_BUYSTOP, clModifyBuy, clModifySell); double op, pa, pb, os, ot; int dg=MarketInfo(OrderSymbol(), MODE_DIGITS), er, it; if (pp<=0) pp=OrderOpenPrice(); if (sl<0 ) sl=OrderStopLoss(); if (tp<0 ) tp=OrderTakeProfit(); pp=NormalizeDouble(pp, dg); sl=NormalizeDouble(sl, dg); tp=NormalizeDouble(tp, dg); op=NormalizeDouble(OrderOpenPrice() , dg); os=NormalizeDouble(OrderStopLoss() , dg); ot=NormalizeDouble(OrderTakeProfit(), dg); if (pp!=op || sl!=os || tp!=ot) { for (it=1; it<=NumberOfTry; it++) { if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break; while (!IsTradeAllowed()) Sleep(5000); RefreshRates(); fm=OrderModify(OrderTicket(), pp, sl, tp, ex, cl); if (fm) { PlaySound("wait.wav"); break; } else { er=GetLastError(); PlaySound("timeout.wav"); pa=MarketInfo(OrderSymbol(), MODE_ASK); pb=MarketInfo(OrderSymbol(), MODE_BID); Print("Error(",er,") modifying order: ",ErrorDescription(er),", try ",it); Print("Ask=",pa," Bid=",pb," sy=",OrderSymbol(), " op="+GetNameOP(OrderType())," pp=",pp," sl=",sl," tp=",tp); Sleep(1000*10); } } } }
我还没有做TP,我还不是特别需要它。
这就是为什么有可能把开盘价 拉高,并把SL放在利润中;)
谢谢你的建设性反馈。
因此,有机会将开盘价 拉高,并将SL放入利润中;)
谢谢你的建设性反馈。
这与takeprofit有什么关系?
你还应该给ModifYSL(double priceModifySL=0)函数添加一个条件,以防万一。正如他们所说,你不能用黄油糟蹋很多粥)。
我们需要引入另一个全局变量 来修改TR。我把这个全局变量称为"ModifySL " 是有原因的。然后是GV的 "ModifyTP"。
是的,我可以看到。我的意思是:如果订单没有止损,我们可以拖动订单本身的线条,止损将被放置在我们 "拖动 "线条的地方。如果我们没有外卖处理,就会出现这种情况。如果我们对止损点和脚趾都进行了处理,但订单两者都没有,那么如果我们绘制订单线,我们应该设置什么?采取还是停止?
明白了。然后,要么制作额外的按钮来设置修改类型,要么按照真实图表上的方式来做。从订单价格的初始运动方向来决定TP或SL应该拉到什么位置。