新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 1656 1...164916501651165216531654165516561657165816591660166116621663...1953 新评论 Artis98 2021.10.09 13:12 #16551 MakarFX,试过了--没有变化,只在买入时打开,卖出时完全无视。 Tretyakov Rostyslav 2021.10.09 13:15 #16552 artem artem #: MakarFX,试过了--没有变化,只在买入时打开,卖出时完全无视。 因此,结论是不存在切换布尔的条件 Artis98 2021.10.09 13:16 #16553 那么你需要添加什么来创造条件呢? Tretyakov Rostyslav 2021.10.09 13:25 #16554 artem artem #: 我们应该在这些条件中加入什么? 解释一下这个逻辑... 第一个很清楚:有一个信号,没有订单开放... ...然后我不明白在什么条件下应该打开或关闭订单 Tretyakov Rostyslav 2021.10.09 13:42 #16555 artem artem #: 那么你需要添加什么来创造条件呢? 试试这个 //+------------------------------------------------------------------+ //| 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)) { Order=false; OrderBuy=true; OrderSell=false; Print("BUY OK"); } } if(CheckForOpen()==1) // Если сигнал для продаж { if(OrderSend(Symbol(),OP_SELL,Lots(),Bid,Slip,Ask+StopLoss*Point,Bid-TakeProfit*Point,"",MagicNumber,0,Red)) { Order=false; OrderBuy=false; OrderSell=true; 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; if(sell==4 && OrderBuy) res=1; return(res); } //+------------------------------------------------------------------+ Artis98 2021.10.09 13:46 #16556 好吧,我按顺序解释一切,尽量具体,不要泛滥...... 它是基于一种叫做 "普里亚法 "的趋势交易策略。它是基于跨越三条移动平均线和MACD柱状图的开口。两个缓慢的周期(75)和(85),线性加权法应用于Low。期限为5的快速平均,指数法,适用于关闭。MACD指标,参数为15/26/1。进场点是由两条慢速移动平均线交叉形成的,MACD条形图与快速条形图打开到相关区域(快速条形图和MACD条形图应在同一区域)。 买入信号--MA(5)穿过并位于MA(75)和MA(85)之上,MACD柱在正区域打开。 卖出信号--MA(5)交叉并低于MA(75)和MA(85),MACD在负值区域有一个开口条。 该EA放置一个固定的利润和止损。利润和止损的大小是在初始参数中设定的。订单只有在达到止盈或止损时才会关闭。 这就是最初的Puria Expert Advisors中的内容。此外,在最新的版本中,还有一个追踪止损和选择按特定时间交易。功能是有用的,但我现在对它们并不感兴趣。 现在,实际上,我已经做了/想要做什么补充。 1.为了进行交易 开盘并 检查所有的指标条件(跨越两个慢速(75)(85)的快速(5)和MACD条在同一方向的快速(5)开盘),只在新蜡烛的开盘价 (每个30分钟蜡烛的第一个刻度) 进行。这一点已经得到了处理。 为指标的 "归零 "创造条件。比如说。 用于快速移动的 (5) 如果它高于慢速--那么它就是一个购买的信号。如果在这之后,它下降并触及其中之一,或处于慢速移动的(75)和(85) 之间--那么来自快速移动指标的信号就像它一样"归零",并将保持在这个 "零 "的位置,只要它触及或保持在慢速1之间。如果在那之后, 快速的一条越过两个慢速的一条到一边(包括如果它在触及慢速的一条之前回到它来的一边)--那么它将是这个指标的一个信号。 使用MACD,情况类似- 只有 MACD=0才会被认为是 "归零"(例如,如果在第一根蜡烛上,MACD以0.0043开盘,而在第二根蜡烛上以-0.0010 开盘,这意味着第二根蜡烛上的 MACD已经"归零" 并发出了新信号)。然而,有一段时间, 快线(5)和MACD应该有点 "平起平坐" - 如果(5)没有改变它相对于慢线的位置,并且MACD在前一根蜡烛上开在错误的区域(没有进场),而在下一根蜡烛上 - 与快线在同一区域,那么所有的条件已经趋同,应该对订单进行进场。请注意,所有这些应该只在蜡烛的开盘价上进行--只在这一个刻度上进行。 而最后,要让专家顾问等待4个连续的蜡烛开盘: 1. 第1个开盘价--(5)高于(75)和(85)+MACD柱子开在0以上--4个确认中的一个; 2.第2根蜡烛的开盘价--(5)超过(75)和(85)+MACD柱子开在0以上-- 4次确认中的2次是; 3.第3根蜡烛的开盘价--(5)超过(75)和(85)+MACD柱子开在0以上-- 4次确认中的3次是; 4.第4根蜡烛的开盘价--(5)超过(75)和(85)+MACD柱在0以上开盘-- 4个确认中 的4个是-- 在同一根蜡烛(第4根)上开立买入交易。 卖出 订单的 情况也一样,只是在另一个方向的指标应该打开。有一点很重要--如果在第1根蜡烛到第4根蜡烛的任何阶段, 指标改变了它们的位置(例如,在第3根开盘的蜡烛上,MACD柱打开时低于0,或者=0)--那么一切都被重置,因为信号没有通过连续第4根蜡烛开盘时的测试。 不知何故,如果有不清楚的地方,或有问题,请提出。 反向交易: 圣杯还是危险的假象 基于交易模块创建多个 EA 交易 针对初学者以 MQL5 编写 EA Tretyakov Rostyslav 2021.10.09 14:02 #16557 artem artem #:好吧,我按顺序解释一切,尽量具体,不要泛滥...... 为指标的 "归零 "创造条件。 这就是归零。 if(malw>mas1&&malw>mas2&&macd>0) {buy+=1; sell=0;} if(malw<mas1&&malw<mas2&&macd<0) {buy=0; sell+=1;} 也许我没有正确理解你... 试着做一个屏幕截图 Artis98 2021.10.09 14:19 #16558 我附上了一张截图,如果你有什么不明白的,就问吧 附加的文件: g9cguyokx_wpm_uu10g.png 72 kb Tretyakov Rostyslav 2021.10.09 14:29 #16559 artem artem #: 我附上了一张截图,如果你有不明白的地方,就问我。 我知道了,我会考虑的。 [删除] 2021.10.09 14:40 #16560 artem artem #: 附上一张截图,如果有什么不清楚的地方--尽管问。 试试这个--它能在这些地方打开吗? //+------------------------------------------------------------------+ //| artem artem.mq4 | //| Copyright 2021, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2021, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property strict //--- #define MagicNumber 122122 //--- #include <stdlib.mqh> // Стандартная библиотека //--- input string s0 = "Баланс"; // 1 input string Template = "ADX"; // Имя шаблона(without '.tpl') input double TargetProfit = 1000000; // Баланс + Прибыль(прибавить к балансу) input double TargetLoss = 0; // Баланс - Убыток(отнять от баланса) input string s1 = "Размер лота"; // 2 input double Lot = 0.01; // размер лота 0 - авт.расчет input string s2 = "TP SL"; // 3 input double InpTProfit = 1000; // Exchange TP input double InpStopLoss = 1000000; // Exchange SL input string s3 = "Индикатор"; // 4 input int MovingPeriodLw = 13; // MovingPeriodLw input int MovingPeriodS1 = 89; // MovingPeriodS1 input int MovingPeriodS2 = 144; // MovingPeriodS2 input string s4 = "Day & Hour"; // 5 input int HrStart = 0; // время начала торговли input int HrEnd = 23; // время окончания торговли //+------------------------------------------------------------------+ int Monday = 1; // Понедельник 1 вкд. 0 выкл. int Tuesday = 1; // Вторник int Wednesday = 1; // Среда int Thursday = 1; // Четверг int Friday = 1; // Пятница //+------------------------------------------------------------------+ uint SLEEPTIME=1; double Price[2]; datetime timeprev=0; ENUM_TIMEFRAMES TimeFrame= PERIOD_CURRENT; bool OrderBuy=false,OrderSell=false,Order=false,Init=true,ClOp=true; //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- Закрыть Общий профит или профит на паре if(ProfitTarget()) { return; } //--- Закрыть профит BUY или SELL на паре ProfitOnTick(); // Определение направления пересечения мувингов if(Init) InitMetod(); // Ожидание нового бара на графике 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,12,26,9,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,3,0,0,"",MagicNumber,0,Blue); Order=false; return; } // Открываем ордер Sell if(macd<0 && OrderSell && Order) { res=OrderSend(Symbol(),OP_SELL,Lots(),Bid,3,0,0,"",MagicNumber,0,Red); Order=false; return; } } //+------------------------------------------------------------------+ //| 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; } //+------------------------------------------------------------------+ //| 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); } //+------------------------------------------------------------------+ // 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; } //+------------------------------------------------------------------+ //| Check for long position closing | //+------------------------------------------------------------------+ bool ProfitTarget(void) { bool res=false; if(AccountInfoDouble(ACCOUNT_EQUITY)<=TargetLoss || AccountInfoDouble(ACCOUNT_EQUITY)>=TargetProfit) { CloseAllOrders(); Sleep(SLEEPTIME*1000); CloseAllOrders(); ExpertRemove(); DeleteChart(); PlaySound("expert.wav"); res=true; } //--- result return(res); } //+------------------------------------------------------------------+ //| Check for long position closing | //+------------------------------------------------------------------+ bool ProfitOnTick(void) { bool res=false; double PROFIT_BUY=0.00; double PROFIT_SELL=0.00; for(int i=OrdersTotal()-1; i>=0; i--) // returns the number of open positions { if(OrderSelect(i,SELECT_BY_POS) && OrderSymbol()==Symbol()) { if(OrderSymbol()==Symbol() && OrderType()==OP_BUY) { PROFIT_BUY=PROFIT_BUY+NormalizeDouble(OrderProfit(),2); } if(OrderSymbol()==Symbol() && OrderType()==OP_SELL) { PROFIT_SELL=PROFIT_SELL+NormalizeDouble(OrderProfit(),2); } } } int Close_ticketb=0; int totalb=OrdersTotal(); int b = 0; for(b = totalb; b >=0; b--) { if(OrderSelect(b,SELECT_BY_POS) && OrderSymbol()==Symbol()) { //OrderSelect(i,SELECT_BY_POS); if(OrderSymbol()==Symbol() && OrderType()==OP_BUY) { if(PROFIT_BUY<-InpStopLoss || PROFIT_BUY>=InpTProfit) { Close_ticketb = OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symbol(),MODE_BID),5); PlaySound("ok.wav"); } } } res=true; } int Close_tickets=0; int totals=OrdersTotal(); int s = 0; for(s = totals; s >=0; s--) { if(OrderSelect(s,SELECT_BY_POS) && OrderSymbol()==Symbol()) { if(OrderSymbol()==Symbol() && OrderType()==OP_SELL) { if(PROFIT_SELL<-InpStopLoss || PROFIT_SELL>=InpTProfit) { Close_tickets = OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symbol(),MODE_ASK),5); PlaySound("ok.wav"); } } } res=true; } //--- result return(res); } //+------------------------------------------------------------------+ //| script program start function | //+------------------------------------------------------------------+ void CloseAllOrders(void) { int iOrders=OrdersTotal()-1, i; if(ClOp) { for(i=iOrders; i>=0; i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && (OrderType()<=OP_SELL) && GetMarketInfo() && !OrderClose(OrderTicket(),OrderLots(),Price[1-OrderType()],0)) Print(OrderError()); if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderDelete(OrderTicket())) Print(OrderError()); } } } } //+------------------------------------------------------------------+ //| Function..: OrderError | //+------------------------------------------------------------------+ string OrderError(void) { int iError=GetLastError(); return(StringConcatenate("Order:",OrderTicket()," GetLastError()=",iError," ",ErrorDescription(iError))); } //+------------------------------------------------------------------+ //| Function..: GetMarketInfo | //+------------------------------------------------------------------+ bool GetMarketInfo(void) { RefreshRates(); Price[0]=MarketInfo(OrderSymbol(),MODE_ASK); Price[1]=MarketInfo(OrderSymbol(),MODE_BID); double dPoint=MarketInfo(OrderSymbol(),MODE_POINT); if(dPoint==0) return(false); return(Price[0]>0.0 && Price[1]>0.0); } //+------------------------------------------------------------------+ //| start function | //+------------------------------------------------------------------+ void DeleteChart(void) { long currChart,prevChart=ChartFirst(); int i=0,limit=100; bool errTemplate; while(i<limit) { currChart=ChartNext(prevChart); if(TimeFrame!=PERIOD_CURRENT) { ChartSetSymbolPeriod(prevChart,ChartSymbol(prevChart),TimeFrame); } errTemplate=ChartApplyTemplate(prevChart,Template+".tpl"); if(!errTemplate) { Print("Error ",ChartSymbol(prevChart),"-> ",GetLastError()); } if(currChart<0) break; Print(i,ChartSymbol(currChart)," ID =",currChart); prevChart=currChart; i++; } } //+------------------------------------------------------------------+ 1...164916501651165216531654165516561657165816591660166116621663...1953 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
MakarFX,试过了--没有变化,只在买入时打开,卖出时完全无视。
我们应该在这些条件中加入什么?
解释一下这个逻辑...
第一个很清楚:有一个信号,没有订单开放...
...然后我不明白在什么条件下应该打开或关闭订单
那么你需要添加什么来创造条件呢?
试试这个
好吧,我按顺序解释一切,尽量具体,不要泛滥......
它是基于一种叫做 "普里亚法 "的趋势交易策略。它是基于跨越三条移动平均线和MACD柱状图的开口。两个缓慢的周期(75)和(85),线性加权法应用于Low。期限为5的快速平均,指数法,适用于关闭。MACD指标,参数为15/26/1。进场点是由两条慢速移动平均线交叉形成的,MACD条形图与快速条形图打开到相关区域(快速条形图和MACD条形图应在同一区域)。
该EA放置一个固定的利润和止损。利润和止损的大小是在初始参数中设定的。订单只有在达到止盈或止损时才会关闭。
这就是最初的Puria Expert Advisors中的内容。此外,在最新的版本中,还有一个追踪止损和选择按特定时间交易。功能是有用的,但我现在对它们并不感兴趣。
现在,实际上,我已经做了/想要做什么补充。
1. 第1个开盘价--(5)高于(75)和(85)+MACD柱子开在0以上--4个确认中的一个;
2.第2根蜡烛的开盘价--(5)超过(75)和(85)+MACD柱子开在0以上-- 4次确认中的2次是;
3.第3根蜡烛的开盘价--(5)超过(75)和(85)+MACD柱子开在0以上-- 4次确认中的3次是;
4.第4根蜡烛的开盘价--(5)超过(75)和(85)+MACD柱在0以上开盘-- 4个确认中 的4个是-- 在同一根蜡烛(第4根)上开立买入交易。
不知何故,如果有不清楚的地方,或有问题,请提出。
好吧,我按顺序解释一切,尽量具体,不要泛滥......
这就是归零。
也许我没有正确理解你...
试着做一个屏幕截图
我附上了一张截图,如果你有不明白的地方,就问我。
附上一张截图,如果有什么不清楚的地方--尽管问。
试试这个--它能在这些地方打开吗?