新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 1655 1...164816491650165116521653165416551656165716581659166016611662...1953 新评论 Tretyakov Rostyslav 2021.10.08 20:34 #16541 Volodymyr Zubov #:有手指的事实是,只把OrderSend,然后不担心出错,是不合适的。你总是要寻找错误。 沃洛佳,这个问题是关于别的东西。 Volodymyr Zubov 2021.10.08 20:38 #16542 MakarFX #:沃洛佳,问题是不同的。 它是什么? Tretyakov Rostyslav 2021.10.08 20:40 #16543 Volodymyr Zubov #:在什么地方? Dobranich) Volodymyr Zubov 2021.10.08 20:48 #16544 MakarFX #: Dobranich) 你也一样。 Artis98 2021.10.09 08:15 #16545 //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- if(CheckForOpen()==0) { if(OrderSend(Symbol(),OP_BUY,Lots(),Ask,Slip,Bid-StopLoss*Point,Ask+TakeProfit*Point,"",MagicNumber,0,Blue)) Print("BUY OK"); } if(CheckForOpen()==1) { if(OrderSend(Symbol(),OP_SELL,Lots(),Bid,Slip,Ask+StopLoss*Point,Bid-TakeProfit*Point,"",MagicNumber,0,Red)) Print("SELL OK"); } } //+------------------------------------------------------------------+ //| Check for open order conditions | //+------------------------------------------------------------------+ int CheckForOpen() // Открытие ордера по методу Пуриа { double malw,mas1,mas2,macd; int res=-1, buy=0, sell=0; // Считывание параметров индикаторов 3 свечи malw=iMA(NULL,0,MovingPeriodLw,0,MODE_EMA,PRICE_CLOSE,3); mas1=iMA(NULL,0,MovingPeriodS1,0,MODE_LWMA,PRICE_LOW,3); mas2=iMA(NULL,0,MovingPeriodS2,0,MODE_LWMA,PRICE_LOW,3); macd=iMACD(NULL,0,15,26,1,PRICE_CLOSE,MODE_MAIN,3); if(malw>mas1&&malw>mas2&&macd>0) {buy+=1; sell=0;} if(malw<mas1&&malw<mas2&&macd<0) {buy=0; sell+=1;} // Считывание параметров индикаторов 2 свечи malw=iMA(NULL,0,MovingPeriodLw,0,MODE_EMA,PRICE_CLOSE,2); mas1=iMA(NULL,0,MovingPeriodS1,0,MODE_LWMA,PRICE_LOW,2); mas2=iMA(NULL,0,MovingPeriodS2,0,MODE_LWMA,PRICE_LOW,2); macd=iMACD(NULL,0,15,26,1,PRICE_CLOSE,MODE_MAIN,2); if(malw>mas1&&malw>mas2&&macd>0) {buy+=1; sell=0;} if(malw<mas1&&malw<mas2&&macd<0) {buy=0; sell+=1;} // Считывание параметров индикаторов 1 свечи malw=iMA(NULL,0,MovingPeriodLw,0,MODE_EMA,PRICE_CLOSE,1); mas1=iMA(NULL,0,MovingPeriodS1,0,MODE_LWMA,PRICE_LOW,1); mas2=iMA(NULL,0,MovingPeriodS2,0,MODE_LWMA,PRICE_LOW,1); macd=iMACD(NULL,0,15,26,1,PRICE_CLOSE,MODE_MAIN,1); if(malw>mas1&&malw>mas2&&macd>0) {buy+=1; sell=0;} if(malw<mas1&&malw<mas2&&macd<0) {buy=0; sell+=1;} // Считывание параметров индикаторов 0 свечи malw=iMA(NULL,0,MovingPeriodLw,0,MODE_EMA,PRICE_CLOSE,0); mas1=iMA(NULL,0,MovingPeriodS1,0,MODE_LWMA,PRICE_LOW,0); mas2=iMA(NULL,0,MovingPeriodS2,0,MODE_LWMA,PRICE_LOW,0); macd=iMACD(NULL,0,15,26,1,PRICE_CLOSE,MODE_MAIN,0); if(malw>mas1&&malw>mas2&&macd>0) {buy+=1; sell=0;} if(malw<mas1&&malw<mas2&&macd<0) {buy=0; sell+=1;} if(buy ==4) res=0; if(sell==4) res=1; return(res); } 你能告诉我如何让它在所有条件都满足的情况下,不在每根新的蜡烛上开出订单吗?我刚刚插入了这段代码,它真的开始等待4根蜡烛的确认,但在开了一次单后(当所有条件都满足时),它开始在所有后续的蜡烛上开单,如果条件持续的话,这就是它在测试器中的样子。 + 以防万一,我将粘贴所有的原始代码,以防我漏掉一些重要的东西。 #define MagicNumber 122122 extern string s1 = "Trading options"; extern double Lot = 0.01; // размер лота 0 - авт.расчет extern double StopLoss = 40; // стоплосс extern double TakeProfit = 10; // тейкпрофит extern double TrailStop = 21; // уровень без убытка extern int Trailing = 0; // трейлинг стоп 1 вкл. 0 выкл. extern int Breakeven = 0; // перенос стоп лосса в без убыток extern string s2 = "Day & Hour"; extern int HrStart = 0; // время начала торговли extern int HrEnd = 23; // время окончания торговли extern int Monday = 1; // Понедельник 1 вкд. 0 выкл. extern int Tuesday = 1; // Вторник extern int Wednesday = 1; // Среда extern int Thursday = 1; // Четверг extern int Friday = 1; // Пятница //+------------------------------------------------------------------+ // параметры индикаторов double MovingPeriodLw = 5; double MovingPeriodS1 = 75; double MovingPeriodS2 = 85; double StopLevel; double TrailStep = 3; // шаг трейлинг стопа bool OrderBuy = false, OrderSell = false, Order = false, Init = true; int timeprev = 0, Slip = 3.0; //+------------------------------------------------------------------+ //| Init function | //+------------------------------------------------------------------+ void OnInit() { if (Digits == 3 || Digits == 5) { // Пересчет для 5-ти знаков TakeProfit *= 10; TrailStop *= 10; TrailStep *= 10; StopLoss *=10; Slip *=10; } return; } //+------------------------------------------------------------------+ //| Start function | //+------------------------------------------------------------------+ void start() { StopLevel = MarketInfo(Symbol(), MODE_STOPLEVEL); // Определение направления пересечения мувингов if (Init) InitMetod(); // Трейлинг стоп открытых позиций if (Trailing != 0 ) RealTrailOrder(TrailStop, TrailStep, StopLevel, MagicNumber); // Ожидание нового бара на графике if(timeprev == Time[0]) return; timeprev = Time[0]; // Открытие ордера по методу Пуриа CheckForOpen(); } //+------------------------------------------------------------------+ //| Check for open order conditions | //+------------------------------------------------------------------+ void CheckForOpen() // Открытие ордера по методу Пуриа { double malw,mas1,mas2,macd; int res; // Считывание параметров индикаторов malw=iMA(NULL,0,MovingPeriodLw,0,MODE_EMA,PRICE_CLOSE,0); mas1=iMA(NULL,0,MovingPeriodS1,0,MODE_LWMA,PRICE_LOW,0); mas2=iMA(NULL,0,MovingPeriodS2,0,MODE_LWMA,PRICE_LOW,0); macd=iMACD(NULL,0,15,26,1,PRICE_CLOSE,MODE_MAIN,0); // Проверяем положение мувмнгов if(malw>mas1 && malw>mas2 && OrderSell) { OrderBuy=true; OrderSell=false; Order=true; } if(malw<mas1 && malw<mas2 && OrderBuy) { OrderBuy=false; OrderSell=true; Order=true; } // Открываем ордер Buy if(macd>0 && OrderBuy && Order) { res=OrderSend(Symbol(),OP_BUY,Lots(),Ask,Slip,Bid-StopLoss*Point,Ask+TakeProfit*Point,"",MagicNumber,0,Blue); Order=false; return; } // Открываем ордер Sell if(macd<0 && OrderSell && Order) { res=OrderSend(Symbol(),OP_SELL,Lots(),Bid,Slip,Ask+StopLoss*Point,Bid-TakeProfit*Point,"",MagicNumber,0,Red); Order=false; return; } } //+------------------------------------------------------------------+ //| Calculate optimal lot size | //+------------------------------------------------------------------+ double Lots() // Расчет объема лота { double Lots; if (Lot > 0) return(Lot); Lots=AccountFreeMargin()/5000; Lots=MathMin(15,MathMax(0.01,Lots)); if(Lots<0.1) Lots=NormalizeDouble(Lots,2); else { if(Lots<1) Lots=NormalizeDouble(Lots,1); else Lots=NormalizeDouble(Lots,0); } return(Lots); } //+------------------------------------------------------------------+ //| Init metod Puria function | //+------------------------------------------------------------------+ void InitMetod() // Опредеоение начального пересечения мувингов { double malw,mas1,mas2; malw=iMA(NULL,0,MovingPeriodLw,0,MODE_EMA,PRICE_CLOSE,0); mas1=iMA(NULL,0,MovingPeriodS1,0,MODE_LWMA,PRICE_LOW,0); mas2=iMA(NULL,0,MovingPeriodS2,0,MODE_LWMA,PRICE_LOW,0); if((malw<=mas1 && malw>=mas2) || (malw>=mas1 && malw<=mas2)) { Init=false; OrderBuy=true; OrderSell=true; } return; } //+------------------------------------------------------------------+ // Treylingstop function | //+------------------------------------------------------------------+ // Трейлинг стоп void RealTrailOrder(double trstop, double trstep, double stlevel, int magic) { double openprice; double openstoploss; double calculatestoploss; double trailstop = MathMax(trstop, stlevel); for (int cmt = OrdersTotal() - 1; cmt >= 0; cmt--) { if(OrderSelect(cmt, SELECT_BY_POS, MODE_TRADES) == TRUE) { if(OrderMagicNumber() == magic && OrderSymbol() == Symbol()) { openprice = OrderOpenPrice(); openstoploss = OrderStopLoss(); while (IsTradeContextBusy()) Sleep(500); RefreshRates(); if(OrderType() == OP_BUY) { calculatestoploss = ND(Bid - trailstop * Point); if((Bid > openprice + trailstop * Point) || (Breakeven == 0)) { if(((calculatestoploss >= openstoploss + trstep * Point) && (trailstop * Point > stlevel * Point))) { if(!OrderModify(OrderTicket(), OrderOpenPrice(), calculatestoploss, OrderTakeProfit(), 0, Blue)) Print("BUY OrderModify Error " + IntegerToString(GetLastError())); } } } if(OrderType() == OP_SELL) { calculatestoploss = ND(Ask + trailstop * Point); if((Ask < openprice - trailstop * Point) || (Breakeven == 0)) { if(((calculatestoploss <= openstoploss - trstep * Point) && (trailstop * Point > stlevel * Point))) { if(!OrderModify(OrderTicket(), OrderOpenPrice(), calculatestoploss, OrderTakeProfit(), 0, Red)) Print("BUY OrderModify Error " + IntegerToString(GetLastError())); } } } } } } } //============================================================================================================================================= double ND(double ad_0) { return (NormalizeDouble(ad_0, Digits)); } //нннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн // // Permission to trade in this day // //******************************************************************************************************** bool TradingDay(int hmin, int hmax) // Определение времени и дня разрешения торговли { bool dtrade = false; switch (DayOfWeek()) { case 1: // Monday if (Monday == 1) dtrade = true; break; case 2: // Tuesday if (Tuesday == 1) dtrade = true; break; case 3: // Wednesday if (Wednesday == 1) dtrade = true; break; case 4: // Thursday if (Thursday == 1) dtrade = true; break; case 5: // Friday if (Friday == 1) dtrade = true; break; default: // dtrade = false; break; } if (dtrade && !(Hour() >= hmin && Hour() <= hmax)) dtrade = true; return dtrade; } 附加的文件: 60hs3zci_pl1cw7.png 51 kb Tretyakov Rostyslav 2021.10.09 08:37 #16546 artem artem #:你能告诉我如何让它在所有条件都满足的情况下,不在每根新的蜡烛上开出订单吗?我刚刚插入了这段代码,它真的开始等待4根蜡烛的确认,但在开了一次单后(当所有条件都满足时),它开始在所有后续的蜡烛上开单,如果条件持续的话,这就是它在测试器中的样子。+ 以防我错过了一些重要的东西。 我需要控制(计数器)未结订单 //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- if(CheckForOpen()==0&&CountTrade(0)==0) // Если сигнал для покупок и нет открытых покупок { if(OrderSend(Symbol(),OP_BUY,Lots(),Ask,Slip,Bid-StopLoss*Point,Ask+TakeProfit*Point,"",MagicNumber,0,Blue)) Print("BUY OK"); } if(CheckForOpen()==1&&CountTrade(1)==0) // Если сигнал для продаж и нет открытых продаж { if(OrderSend(Symbol(),OP_SELL,Lots(),Bid,Slip,Ask+StopLoss*Point,Bid-TakeProfit*Point,"",MagicNumber,0,Red)) Print("SELL OK"); } } //+----------------------------------------------------------------------------+ //| Счетчик ордеров (0)-buy (1)-sell ()-all | //+----------------------------------------------------------------------------+ int CountTrade(int ot=-1) { int count = 0; for(int i = OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) { if(OrderType()==ot||ot<0) count++; } } } return(count); } //+------------------------------------------------------------------+ //| Check for open order conditions | //+------------------------------------------------------------------+ int CheckForOpen() // Открытие ордера по методу Пуриа { double malw,mas1,mas2,macd; int res=-1, buy=0, sell=0; // Считывание параметров индикаторов 3 свечи malw=iMA(NULL,0,MovingPeriodLw,0,MODE_EMA,PRICE_CLOSE,3); mas1=iMA(NULL,0,MovingPeriodS1,0,MODE_LWMA,PRICE_LOW,3); mas2=iMA(NULL,0,MovingPeriodS2,0,MODE_LWMA,PRICE_LOW,3); macd=iMACD(NULL,0,15,26,1,PRICE_CLOSE,MODE_MAIN,3); if(malw>mas1&&malw>mas2&&macd>0) {buy+=1; sell=0;} if(malw<mas1&&malw<mas2&&macd<0) {buy=0; sell+=1;} // Считывание параметров индикаторов 2 свечи malw=iMA(NULL,0,MovingPeriodLw,0,MODE_EMA,PRICE_CLOSE,2); mas1=iMA(NULL,0,MovingPeriodS1,0,MODE_LWMA,PRICE_LOW,2); mas2=iMA(NULL,0,MovingPeriodS2,0,MODE_LWMA,PRICE_LOW,2); macd=iMACD(NULL,0,15,26,1,PRICE_CLOSE,MODE_MAIN,2); if(malw>mas1&&malw>mas2&&macd>0) {buy+=1; sell=0;} if(malw<mas1&&malw<mas2&&macd<0) {buy=0; sell+=1;} // Считывание параметров индикаторов 1 свечи malw=iMA(NULL,0,MovingPeriodLw,0,MODE_EMA,PRICE_CLOSE,1); mas1=iMA(NULL,0,MovingPeriodS1,0,MODE_LWMA,PRICE_LOW,1); mas2=iMA(NULL,0,MovingPeriodS2,0,MODE_LWMA,PRICE_LOW,1); macd=iMACD(NULL,0,15,26,1,PRICE_CLOSE,MODE_MAIN,1); if(malw>mas1&&malw>mas2&&macd>0) {buy+=1; sell=0;} if(malw<mas1&&malw<mas2&&macd<0) {buy=0; sell+=1;} // Считывание параметров индикаторов 0 свечи malw=iMA(NULL,0,MovingPeriodLw,0,MODE_EMA,PRICE_CLOSE,0); mas1=iMA(NULL,0,MovingPeriodS1,0,MODE_LWMA,PRICE_LOW,0); mas2=iMA(NULL,0,MovingPeriodS2,0,MODE_LWMA,PRICE_LOW,0); macd=iMACD(NULL,0,15,26,1,PRICE_CLOSE,MODE_MAIN,0); if(malw>mas1&&malw>mas2&&macd>0) {buy+=1; sell=0;} if(malw<mas1&&malw<mas2&&macd<0) {buy=0; sell+=1;} if(buy ==4) res=0; if(sell==4) res=1; return(res); } Artis98 2021.10.09 09:12 #16547 试了一下,是的,没有再重新进入。但如果Countrade这样做了,那么只要至少有一个订单是开放的,就不会对新的信号有任何反应,这是没有必要的。也就是说,在第一次之后不应该再开仓,但是如果Malw或/和macd改变了位置,并且根据条件是一个信号+如果信号连续4次被确认=>开仓,也应该有一个订单进入。如果这被添加到代码中,那么,理想情况下,一切都应该准备好了。还有什么需要添加的吗? Tretyakov Rostyslav 2021.10.09 11:30 #16548 artem artem 开仓,也应该有一个订单进入。如果这被添加到代码中,那么,理想情况下,一切都应该准备好了。还有什么需要添加的吗? 如果我们把它分成几份,也会发生同样的事情。在这种情况下,所有的功能都是根据你描述的条件建立的。 Artis98 2021.10.09 12:37 #16549 试着对MakarFX 的代码进行修改, 这就是我目前的情况。 #define MagicNumber 122122 extern string s1 = "Trading options"; extern double Lot = 0.01; // размер лота 0 - авт.расчет extern double StopLoss = 40; // стоплосс extern double TakeProfit = 10; // тейкпрофит extern double TrailStop = 21; // уровень без убытка extern int Trailing = 0; // трейлинг стоп 1 вкл. 0 выкл. extern int Breakeven = 0; // перенос стоп лосса в без убыток extern string s2 = "Day & Hour"; extern int HrStart = 0; // время начала торговли extern int HrEnd = 23; // время окончания торговли extern int Monday = 1; // Понедельник 1 вкд. 0 выкл. extern int Tuesday = 1; // Вторник extern int Wednesday = 1; // Среда extern int Thursday = 1; // Четверг extern int Friday = 1; // Пятница //+------------------------------------------------------------------+ // параметры индикаторов double MovingPeriodLw = 5; double MovingPeriodS1 = 75; double MovingPeriodS2 = 85; double StopLevel; double TrailStep = 3; // шаг трейлинг стопа bool OrderBuy = false, OrderSell = false, Order = false, Init = true; int timeprev = 0, Slip = 3.0; //+------------------------------------------------------------------+ //| Init function | //+------------------------------------------------------------------+ void OnInit() { if (Digits == 3 || Digits == 5) { // Пересчет для 5-ти знаков TakeProfit *= 10; TrailStop *= 10; TrailStep *= 10; StopLoss *=10; Slip *=10; } return; } //+------------------------------------------------------------------+ //| Start function | //+------------------------------------------------------------------+ void start() { StopLevel = MarketInfo(Symbol(), MODE_STOPLEVEL); // Определение направления пересечения мувингов if (Init) InitMetod(); // Трейлинг стоп открытых позиций if (Trailing != 0 ) RealTrailOrder(TrailStop, TrailStep, StopLevel, MagicNumber); // Ожидание нового бара на графике if(timeprev == Time[0]) return; timeprev = Time[0]; // Открытие ордера по методу Пуриа if(CheckForOpen()==0) // Если сигнал для покупок { if(OrderSend(Symbol(),OP_BUY,Lots(),Ask,Slip,Bid-StopLoss*Point,Ask+TakeProfit*Point,"",MagicNumber,0,Blue)) Print("BUY OK"); } if(CheckForOpen()==1) // Если сигнал для продаж { if(OrderSend(Symbol(),OP_SELL,Lots(),Bid,Slip,Ask+StopLoss*Point,Bid-TakeProfit*Point,"",MagicNumber,0,Red)) Print("SELL OK"); } } //+------------------------------------------------------------------+ //| Check for open order conditions | //+------------------------------------------------------------------+ int CheckForOpen() // Открытие ордера по методу Пуриа { double malw,mas1,mas2,macd; int res=-1, buy=0, sell=0; // Считывание параметров индикаторов 3 свечи (4ой) malw=iMA(NULL,0,MovingPeriodLw,0,MODE_EMA,PRICE_CLOSE,3); mas1=iMA(NULL,0,MovingPeriodS1,0,MODE_LWMA,PRICE_LOW,3); mas2=iMA(NULL,0,MovingPeriodS2,0,MODE_LWMA,PRICE_LOW,3); macd=iMACD(NULL,0,15,26,1,PRICE_CLOSE,MODE_MAIN,3); if(malw>mas1&&malw>mas2&&macd>0) {buy+=1; sell=0;} if(malw<mas1&&malw<mas2&&macd<0) {buy=0; sell+=1;} // Считывание параметров индикаторов 2 свечи (3ей) malw=iMA(NULL,0,MovingPeriodLw,0,MODE_EMA,PRICE_CLOSE,2); mas1=iMA(NULL,0,MovingPeriodS1,0,MODE_LWMA,PRICE_LOW,2); mas2=iMA(NULL,0,MovingPeriodS2,0,MODE_LWMA,PRICE_LOW,2); macd=iMACD(NULL,0,15,26,1,PRICE_CLOSE,MODE_MAIN,2); if(malw>mas1&&malw>mas2&&macd>0) {buy+=1; sell=0;} if(malw<mas1&&malw<mas2&&macd<0) {buy=0; sell+=1;} // Считывание параметров индикаторов 1 свечи (2ой) malw=iMA(NULL,0,MovingPeriodLw,0,MODE_EMA,PRICE_CLOSE,1); mas1=iMA(NULL,0,MovingPeriodS1,0,MODE_LWMA,PRICE_LOW,1); mas2=iMA(NULL,0,MovingPeriodS2,0,MODE_LWMA,PRICE_LOW,1); macd=iMACD(NULL,0,15,26,1,PRICE_CLOSE,MODE_MAIN,1); if(malw>mas1&&malw>mas2&&macd>0) {buy+=1; sell=0;} if(malw<mas1&&malw<mas2&&macd<0) {buy=0; sell+=1;} // Считывание параметров индикаторов 0 свечи (1ой) malw=iMA(NULL,0,MovingPeriodLw,0,MODE_EMA,PRICE_CLOSE,0); mas1=iMA(NULL,0,MovingPeriodS1,0,MODE_LWMA,PRICE_LOW,0); mas2=iMA(NULL,0,MovingPeriodS2,0,MODE_LWMA,PRICE_LOW,0); macd=iMACD(NULL,0,15,26,1,PRICE_CLOSE,MODE_MAIN,0); if(malw>mas1&&malw>mas2&&macd>0) {buy+=1; sell=0;} if(malw<mas1&&malw<mas2&&macd<0) {buy=0; sell+=1;} if(buy ==4 && OrderSell) { res=0; Order=false; OrderBuy=true; OrderSell=false; } if(sell==4 && OrderBuy) { res=1; Order=false; OrderBuy=false; OrderSell=true; } return(res); } //+------------------------------------------------------------------+ //| Calculate optimal lot size | //+------------------------------------------------------------------+ double Lots() // Расчет объема лота { double Lots; if (Lot > 0) return(Lot); Lots=AccountFreeMargin()/5000; Lots=MathMin(15,MathMax(0.01,Lots)); if(Lots<0.1) Lots=NormalizeDouble(Lots,2); else { if(Lots<1) Lots=NormalizeDouble(Lots,1); else Lots=NormalizeDouble(Lots,0); } return(Lots); } //+------------------------------------------------------------------+ //| Init metod Puria function | //+------------------------------------------------------------------+ void InitMetod() // Опредеоение начального пересечения мувингов { double malw,mas1,mas2; malw=iMA(NULL,0,MovingPeriodLw,0,MODE_EMA,PRICE_CLOSE,0); mas1=iMA(NULL,0,MovingPeriodS1,0,MODE_LWMA,PRICE_LOW,0); mas2=iMA(NULL,0,MovingPeriodS2,0,MODE_LWMA,PRICE_LOW,0); if((malw<=mas1 && malw>=mas2) || (malw>=mas1 && malw<=mas2)) { Init=false; OrderBuy=true; OrderSell=true; } return; } //+------------------------------------------------------------------+ // Treylingstop function | //+------------------------------------------------------------------+ // Трейлинг стоп void RealTrailOrder(double trstop, double trstep, double stlevel, int magic) { double openprice; double openstoploss; double calculatestoploss; double trailstop = MathMax(trstop, stlevel); for (int cmt = OrdersTotal() - 1; cmt >= 0; cmt--) { if(OrderSelect(cmt, SELECT_BY_POS, MODE_TRADES) == TRUE) { if(OrderMagicNumber() == magic && OrderSymbol() == Symbol()) { openprice = OrderOpenPrice(); openstoploss = OrderStopLoss(); while (IsTradeContextBusy()) Sleep(500); RefreshRates(); if(OrderType() == OP_BUY) { calculatestoploss = ND(Bid - trailstop * Point); if((Bid > openprice + trailstop * Point) || (Breakeven == 0)) { if(((calculatestoploss >= openstoploss + trstep * Point) && (trailstop * Point > stlevel * Point))) { if(!OrderModify(OrderTicket(), OrderOpenPrice(), calculatestoploss, OrderTakeProfit(), 0, Blue)) Print("BUY OrderModify Error " + IntegerToString(GetLastError())); } } } if(OrderType() == OP_SELL) { calculatestoploss = ND(Ask + trailstop * Point); if((Ask < openprice - trailstop * Point) || (Breakeven == 0)) { if(((calculatestoploss <= openstoploss - trstep * Point) && (trailstop * Point > stlevel * Point))) { if(!OrderModify(OrderTicket(), OrderOpenPrice(), calculatestoploss, OrderTakeProfit(), 0, Red)) Print("BUY OrderModify Error " + IntegerToString(GetLastError())); } } } } } } } //============================================================================================================================================= double ND(double ad_0) { return (NormalizeDouble(ad_0, Digits)); } //нннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн // // Permission to trade in this day // //******************************************************************************************************** bool TradingDay(int hmin, int hmax) // Определение времени и дня разрешения торговли { bool dtrade = false; switch (DayOfWeek()) { case 1: // Monday if (Monday == 1) dtrade = true; break; case 2: // Tuesday if (Tuesday == 1) dtrade = true; break; case 3: // Wednesday if (Wednesday == 1) dtrade = true; break; case 4: // Thursday if (Thursday == 1) dtrade = true; break; case 5: // Friday if (Friday == 1) dtrade = true; break; default: // dtrade = false; break; } if (dtrade && !(Hour() >= hmin && Hour() <= hmax)) dtrade = true; return dtrade; } 突出显示的是我试图从我这里补充的内容。结果是,一切都像它应该的那样运作,但 交易只在购买时打开。我如何让它也能开卖,谁知道呢? Tretyakov Rostyslav 2021.10.09 12:57 #16550 artem artem #:试着对MakarFX 的代码进行修改, 这就是我目前的情况。突出显示的是我试图从我这里补充的内容。结果是,一切都像它应该的那样运作,但 交易只在购买时打开。我如何让它也能开卖,谁知道呢? 试着把 "真实 "放在开头 bool OrderBuy = false, OrderSell = false, 1...164816491650165116521653165416551656165716581659166016611662...1953 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
有手指的事实是,只把OrderSend,然后不担心出错,是不合适的。你总是要寻找错误。
沃洛佳,这个问题是关于别的东西。
沃洛佳,问题是不同的。
它是什么?
在什么地方?
Dobranich)
你也一样。
你能告诉我如何让它在所有条件都满足的情况下,不在每根新的蜡烛上开出订单吗?我刚刚插入了这段代码,它真的开始等待4根蜡烛的确认,但在开了一次单后(当所有条件都满足时),它开始在所有后续的蜡烛上开单,如果条件持续的话,这就是它在测试器中的样子。
+ 以防万一,我将粘贴所有的原始代码,以防我漏掉一些重要的东西。
你能告诉我如何让它在所有条件都满足的情况下,不在每根新的蜡烛上开出订单吗?我刚刚插入了这段代码,它真的开始等待4根蜡烛的确认,但在开了一次单后(当所有条件都满足时),它开始在所有后续的蜡烛上开单,如果条件持续的话,这就是它在测试器中的样子。
+ 以防我错过了一些重要的东西。
我需要控制(计数器)未结订单
试着对MakarFX 的代码进行修改, 这就是我目前的情况。
突出显示的是我试图从我这里补充的内容。结果是,一切都像它应该的那样运作,但 交易只在购买时打开。我如何让它也能开卖,谁知道呢?
试着对MakarFX 的代码进行修改, 这就是我目前的情况。
突出显示的是我试图从我这里补充的内容。结果是,一切都像它应该的那样运作,但 交易只在购买时打开。我如何让它也能开卖,谁知道呢?