新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 538 1...531532533534535536537538539540541542543544545...1953 新评论 Ivan Katsko 2018.04.24 08:24 #5371 Ihor Herasko: 这种互换计算方法被称为滚存。你不能在MT4中以编程方式了解它。只有在午夜改变工作市场秩序后,才会间接。在MT4中,有很多这样的小问题,但相当令人不快。在MT5中,这种情况要少一些,但它们仍然存在。 这些是以点为单位的互换值。它们应该根据市场订单的数量,被转换成存款的货币。然后就可以得到真正的互换大小。"在MT4中没有办法以程序化的方式发现它"。- 谢谢你的时间和答复。 Denis Danilov 2018.04.25 05:16 #5372 日安!亲爱的论坛网友,请帮我理解一下这个算法。其目的是确定指定时间段内的价格范围,并在最高和最低点设置买入和卖出止损。止损设置在相反的订单上,TakeProfit应该等于StopLoss*2。 然后,在每次止损平仓后,订单 会以与平仓订单相同的止损和止盈恢复,一旦其中一个订单被止盈平仓,整个循环就完成了。而所有从一开始,我们就定义了范围,然后去。 但现在他就是不放TP,或者说他把TP放在开盘价上,而止损不在范围大小上,也就是说不在一个相反方向的订单上。我预先感谢他的帮助。 static int prevtime = 0; int MagicNumber = 12345678; input int stoploss = 40; input int takeprofit = 50; input int padding = 5; int a=1; input string startTime = "14:35"; input string endTime = "18:35"; int expertBars; double max, min; bool isEndTime = true; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- //sendOrders(); return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ #include <expert.mq4> int start() { //Возвращает максимум и минимум за промежуток if(isTime()) getMaxMin(); // всё, что задается ниже - будет работать по "ценам открытия" //нового бара, т.е. будет срабатывать в момент его появления //на том графике, на кот. стоит советник CheckEvents( MagicNumber ); if ( eventBuyClosed_SL > 0 ) { Alert( _Symbol, OrderClosePrice(), ": Buy-позиция закрыта по СтопЛоссу!" ); double minstoplevel=MarketInfo(Symbol(),MODE_STOPLEVEL); Alert("Минимальный стоп левел: ", minstoplevel); OrderSend(_Symbol,OP_BUYSTOP,OrderLots(),OrderOpenPrice(),3,OrderStopLoss(),OrderTakeProfit(),"My order",MagicNumber,0,clrGreen); } if ( eventBuyClosed_TP > 0 ) { Alert( _Symbol, OrderClosePrice(), ": Buy-позиция закрыта по ТейкПрофиту!" ); deleteAllPaddingOrders(); } if ( eventSellClosed_SL > 0 ) { Alert( _Symbol, OrderClosePrice(), ": Sell-позиция закрыта по СтопЛоссу!" ); double minstoplevel=MarketInfo(Symbol(),MODE_STOPLEVEL); Alert("Минимальный стоп левел: ", minstoplevel); OrderSend(_Symbol,OP_SELLSTOP,OrderLots(),OrderOpenPrice(),3,OrderStopLoss(),OrderTakeProfit(),"My order",MagicNumber,0,clrRed); } if ( eventSellClosed_TP > 0 ) { Alert( _Symbol, OrderClosePrice(), ": Sell-позиция закрыта по ТейкПрофиту!" ); deleteAllPaddingOrders(); } if ( eventBuyLimitOpened > 0 || eventBuyStopOpened > 0 || eventSellLimitOpened > 0 || eventSellStopOpened > 0 ) Alert( _Symbol, OrderType(), ": сработал отложенный ордер!" ); return(0); } //-----------------------------------------------------------------+ void deleteAllPaddingOrders() { int total = OrdersTotal(); for(int i=total-1;i>=0;i--) { OrderSelect(i, SELECT_BY_POS); int type = OrderType(); if (OrderMagicNumber() != MagicNumber) continue; if (OrderSymbol() != _Symbol) continue; bool result = false; switch(type) { //Close opened long positions case OP_BUY : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Red ); break; //Close opened short positions case OP_SELL : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, Red ); // break; //Close pending orders //case OP_BUYLIMIT : //case OP_SELLLIMIT : case OP_BUYSTOP : case OP_SELLSTOP : result = OrderDelete( OrderTicket() ); } if(result == false) { Alert("Order " , OrderTicket() , " failed to close. Error:" , GetLastError() ); Sleep(3000); } return; } return; } void sendOrders(bool isFirst) { //--- получим минимальное значение Stop level double minstoplevel=MarketInfo(Symbol(),MODE_STOPLEVEL); Print("Minimum Stop Level=",minstoplevel," points"); //--- BUYSTOP //--- вычисленные значения цен SL и TP должны быть нормализованы //--- размещаем рыночный ордер на покупку 1 лота int ticketBuyStop, ticketSellStop; if(!isFirst) { ticketBuyStop=OrderSend(Symbol(),OP_BUYSTOP,1,Ask + padding * Point,20,Bid -padding*Point,Ask + padding * Point,"My order",MagicNumber,0,clrGreen); ticketSellStop=OrderSend(Symbol(),OP_SELLSTOP,1,Bid - padding * Point,20,Ask + padding*Point,Bid - padding * Point,"My order",MagicNumber,0,clrRed); } else { ticketBuyStop=OrderSend(Symbol(),OP_BUYSTOP,1,max + padding * Point,20,min -padding*Point,max + (max - min + padding) * Point,"My order",MagicNumber,0,clrGreen); ticketSellStop=OrderSend(Symbol(),OP_SELLSTOP,1,min - padding * Point,20,max + padding*Point,min - (max - min + padding)*Point,"My order",MagicNumber,0,clrRed); } if(ticketBuyStop<0) { Print("OrderSend завершилась с ошибкой #",GetLastError()); deleteAllPaddingOrders(); if(a <=5) { //sendOrders(isFirst); a= a+1; } } else Print("Функция OrderSend успешно выполнена"); //---BUYSTOP //---SELLSTOP //--- вычисленные значения цен SL и TP должны быть нормализованы //--- размещаем рыночный ордер на покупку 1 лота if(ticketSellStop<0) { deleteAllPaddingOrders(); if(a <= 5) { //sendOrders(); a= a+1; Print("a", a); } Print("OrderSend завершилась с ошибкой #",GetLastError()); } else Print("Функция OrderSend успешно выполнена"); //---SELLSTOP return; } bool getMaxMin() { int startIndex = iBarShift(_Symbol, 0, StrToTime(startTime), true); min=iLow(NULL,0,iLowest(NULL,0,MODE_LOW,startIndex,0)); max=iHigh(NULL,0,iHighest(NULL,0,MODE_HIGH,startIndex,0)); Alert("Min: ", min); Alert("Max: ", max); sendOrders(true); return true; } //===============================================================================+ //======| возвращает true если временной диапозон кончился | //===============================================================================+ bool isTime() { if (TimeHour(StrToTime(startTime)) == Hour() && TimeMinute(StrToTime(startTime)) == Minute() && isEndTime) { Alert("Start Timeline"); isEndTime = false; deleteAllPaddingOrders();}; if(TimeHour(StrToTime(endTime)) == Hour() && TimeMinute(StrToTime(endTime)) <= Minute() && !isEndTime) { Alert("End Timeline"); isEndTime = true; return true;}; return false; } //=====================================================================+ //======| возвращает true если появился новый бар, иначе false | //=====================================================================+ //bool isNewBar() //{ //bool res=false; //if(expertBars!=iBars(Symbol(),0)) //{ //expertBars=iBars( Symbol (),0); //res=true; //} //return(res); //} Ihor Herasko 2018.04.25 10:36 #5373 Sobbaka:没有必要在不同的主题 中重复提问。 YanSay 2018.04.25 16:02 #5374 下午好! 当在日志中测试时,我得到OrderSend 错误130--如果我理解正确的话,它只能与止损或冲刺有关,请检查是什么问题。 #define MagicNumber1 100 //Buy input double MaximumRisk=0.03; //Max риск в сделке input double K=1; //Коэффициент риск к прибыли input int OrderPoint=30; //Расстояние до отложенного ордера double Price=0; //Цена для установки отложенного ордера double SL=0; //Stop Loss double TP=0; //Take Profit double Lots=0; //Просчет лотности исходя из max риска одной сделки void OnTick() { //Параметры для открытия ордера Price = NormalizeDouble(High[1]+OrderPoint*Point,Digits); //Цена открытия ордера SL = NormalizeDouble(Low[1]-Point,Digits); //Стоп лосс if ((Price-SL)<NormalizeDouble(MarketInfo(Symbol(),MODE_STOPLEVEL)*Point,Digits)) {SL=Price-NormalizeDouble(MarketInfo(Symbol(),MODE_STOPLEVEL)*Point,Digits);} TP = NormalizeDouble((Price-SL)*K+Price,Digits); //Тэйк профит //Просчет лотности исходя из риска в сделке Lots = NormalizeDouble(((AccountBalance()*MaximumRisk/100.0)/((Price-SL)*1000.0)),1); //Установка отложенного ордера bool send1=OrderSend(Symbol(),OP_BUYSTOP,Lots,Price,3,SL,TP,"comment",MagicNumber1,0,clrGreen); } Ihor Herasko 2018.04.25 17:44 #5375 YanSay:下午好! 在日志中测试时,有一个错误OrderSend error 130 - 如果我理解正确的话,它只能与止损或冲刺有关。 挂单的 开盘价也会受到影响。这就是为什么我们需要检查当前市场价格和订单的开仓价格之间的距离。在这种情况下。价格--询问。 YanSay 2018.04.25 18:12 #5376 Ihor Herasko: 挂单 的开盘价也适用。因此,我们还应该检查当前市场价格和订单开盘价格之间的距离。在这种情况下。价格--询问。 谢谢你! PolarSeaman 2018.04.25 20:03 #5377 Artyom Trishkin: Hour()函数的回报是什么?返回当前小时。我是这样工作的:如果当前小时大于11,小于17。 if(Hour()>=17&&Hour()<=11)continue; 但怎么做呢? PolarSeaman 2018.04.25 20:09 #5378 Tigerfreerun:这对我来说有点复杂。你能解释一下在代码的哪个部分添加,mn和mag_n是什么意思? 我应该把我的EA medjic放在哪里? 在你的条件把 if(Hour()>=0&&Hour()<=8&&!OP_TO(mag_n))step = 5; else step =10;mag_n - 在这里我应该把我的EA的IG放在哪里? Vitaly Muzichenko 2018.04.25 20:12 #5379 PolarSeaman:我在写:如果当前时间超过11点,小于17点,应该如何?我理解,问题是关于指标的。而不是Hour() -> time[i] PolarSeaman 2018.04.25 20:16 #5380 Vitaly Muzichenko:我理解问题是关于指标的。而不是Hour() -> time[i]。是的,你帮忙了,现在我想限制一下时间。不包括从下午5点到晚上11点的计数。 for(int i=limit-2; i>0; i--) { if(Hour()>=17&&Hour()<=11)continue; if(i%2==0) { if(open[i]<close[i] && open[i+1]>close[i+1]) { k1++; // if(k1>max) {max=k1; dat_max=time[i];} if(k1>=4)Print("Num: ",k1,"dat_max ",time[i]); SetText("Obj_"+(string)time[i],(string)k1,time[i],high[i],Arr); } else k1=0; } else { if(open[i]<close[i] && open[i+1]>close[i+1]) { k2++; //if(k2>max){ max=k2; dat_max=time[i];} if(k2>=4)Print("Num: ",k2,"dat_max ",time[i]); SetText("Obj_"+(string)time[i],(string)k2,time[i],high[i],Arr); } else k2=0; } } 1...531532533534535536537538539540541542543544545...1953 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
这种互换计算方法被称为滚存。你不能在MT4中以编程方式了解它。只有在午夜改变工作市场秩序后,才会间接。在MT4中,有很多这样的小问题,但相当令人不快。在MT5中,这种情况要少一些,但它们仍然存在。
这些是以点为单位的互换值。它们应该根据市场订单的数量,被转换成存款的货币。然后就可以得到真正的互换大小。
"在MT4中没有办法以程序化的方式发现它"。- 谢谢你的时间和答复。
日安!亲爱的论坛网友,请帮我理解一下这个算法。其目的是确定指定时间段内的价格范围,并在最高和最低点设置买入和卖出止损。止损设置在相反的订单上,TakeProfit应该等于StopLoss*2。
然后,在每次止损平仓后,订单 会以与平仓订单相同的止损和止盈恢复,一旦其中一个订单被止盈平仓,整个循环就完成了。而所有从一开始,我们就定义了范围,然后去。
但现在他就是不放TP,或者说他把TP放在开盘价上,而止损不在范围大小上,也就是说不在一个相反方向的订单上。我预先感谢他的帮助。
没有必要在不同的主题 中重复提问。
下午好!
当在日志中测试时,我得到OrderSend 错误130--如果我理解正确的话,它只能与止损或冲刺有关,请检查是什么问题。
下午好!
在日志中测试时,有一个错误OrderSend error 130 - 如果我理解正确的话,它只能与止损或冲刺有关。
挂单的 开盘价也会受到影响。这就是为什么我们需要检查当前市场价格和订单的开仓价格之间的距离。在这种情况下。价格--询问。
挂单 的开盘价也适用。因此,我们还应该检查当前市场价格和订单开盘价格之间的距离。在这种情况下。价格--询问。
Hour()函数的回报是什么?
返回当前小时。我是这样工作的:如果当前小时大于11,小于17。
但怎么做呢?
这对我来说有点复杂。你能解释一下在代码的哪个部分添加,mn和mag_n是什么意思? 我应该把我的EA medjic放在哪里?
在你的条件把
mag_n - 在这里我应该把我的EA的IG放在哪里?
我在写:如果当前时间超过11点,小于17点,应该如何?
我理解,问题是关于指标的。而不是Hour() -> time[i]
我理解问题是关于指标的。而不是Hour() -> time[i]。
是的,你帮忙了,现在我想限制一下时间。不包括从下午5点到晚上11点的计数。