新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 1801 1...179417951796179717981799180018011802180318041805180618071808...1953 新评论 Tretyakov Rostyslav 2021.12.08 11:07 #18001 законопослушный гражданин #:对不起,我第二次提出这个问题了。// Параметры советника input string sParametersEA = ""; // Параметры советника input double Lot = 0.01; // Количество лотов input int StopLoss = 30; // Уровень убытка input int TakeProfit = 30; // Уровень прибыли input int Slippage = 3; // Проскальзование (в пунктах) input int Magic = 1; // Индентификатор советника input double K_Martin1 = 2.0; // Множитель мартин 1 input double K_Martin2 = 2.0; // Множитель мартин 2 input double K_Martin3 = 2.0; // Множитель мартин 3 input int OrdersClose = 5; // Ограничение лотности мартин1 input int OrdersClose2 = 5; // Ограничение лотности мартин2 input int DigitsLot = 2; // Точность лотности // Параметры индикатора input string sParametersMA = ""; // Параметры индикатора input int PeriodMA = 14; // Период мувинга input int MovingShift = 1; // Сдвиг мувинга // Глобальные переменные string AC; datetime Start, newbar; double dMA; double MaxMartinLot; double MaxMartinLot2; //+-----------------------------------------------------------------------------------------------+ int OnInit() { Start = TimeCurrent(); MaxMartinLot = Lot*MathPow(1.4,OrdersClose); MaxMartinLot2 = Lot*MathPow(K_Martin2,OrdersClose2); AC = StringConcatenate(" ", AccountCurrency()); return(INIT_SUCCEEDED); } //+-----------------------------------------------------------------------------------------------+ void OnDeinit(const int reason) { } //+-----------------------------------------------------------------------------------------------+ void OnTick() { // Получим значение индикатора dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0. // Если нет открытых ордеров, то входим в условие if(CountOrders()==0) { // Если появился сигнал на покупку, то откроем ордер на покупку if(bSignalBuy() == true) vOrderOpenBuy(); // Если появился сигнал на продажу, то откроем ордер на продажу if(bSignalSell() == true) vOrderOpenSell(); } } //+-----------------------------------------------------------------------------------------------+ //| Функция проверки открытых оредров | //+-----------------------------------------------------------------------------------------------+ int CountOrders() { int cnt=0; int i=OrdersTotal()-1; for(int pos=i;pos>=0;pos--) { if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)) { if(OrderSymbol()==_Symbol) { if(OrderMagicNumber()==Magic) cnt++; } } } return(cnt); } //+-----------------------------------------------------------------------------------------------+ //| Функция поиска сигнала на покупку | //+-----------------------------------------------------------------------------------------------+ bool bSignalBuy() { if(dMA > Open[1] && dMA < Close[1]) //Open[1] и Close[1]- цены открытия и закрытия каждого бара текущего графика. return(true); return(false); } //+-----------------------------------------------------------------------------------------------+ //| Функция поиска сигнала на продажу | //+-----------------------------------------------------------------------------------------------+ bool bSignalSell() { if(dMA < Open[1] && dMA > Close[1]) return(true); return(false); } //+-----------------------------------------------------------------------------------------------+ //| Функция открытия ордера на покупку | //+-----------------------------------------------------------------------------------------------+ void vOrderOpenBuy() { if(newbar!=Time[0]) { // Тикет ордера int iOTi = 0; iOTi = OrderSend(Symbol(), OP_BUY, LOT(), Ask, Slippage, 0, 0, "", Magic, 0, clrNONE); // Проверим открылся ли ордер if(iOTi > 0) // Есди да, то выставим уровни убытка и прибыли vOrderModify(iOTi); else // Если нет, то получим ошибку vError(GetLastError()); newbar=Time[0]; } } //+-----------------------------------------------------------------------------------------------+ //| Функция открытия ордера на продажу | //+-----------------------------------------------------------------------------------------------+ void vOrderOpenSell() { if(newbar!=Time[0]) { // Тикет ордера int iOTi = 0; //Print(bCheckOrders()); iOTi = OrderSend(Symbol(), OP_SELL, LOT(), Bid, Slippage, 0, 0, "", Magic, 0, clrNONE); // Проверим открылся ли ордер if(iOTi > 0) // Есди да, то выставим уровни убытка и прибыли vOrderModify(iOTi); else // Если нет, то получим ошибку vError(GetLastError()); newbar=Time[0]; } } //+-----------------------------------------------------------------------------------------------+ //| Функция модификации ордера | //+-----------------------------------------------------------------------------------------------+ void vOrderModify(int iOTi) { int iOTy = -1; // Тип ордера double dOOP = 0; // Цена открытия ордера double dOSL = 0; // Стоп Лосс int iMag = 0; // Идентификатор советника double dSL = 0; // Уровень убытка double dTP = 0; // Уровень прибыли // Выберем по тикету открытый ордер, получим некоторые значения if(OrderSelect(iOTi, SELECT_BY_TICKET, MODE_TRADES)) { iOTy = OrderType(); dOOP = OrderOpenPrice(); dOSL = OrderStopLoss(); iMag = OrderMagicNumber(); } // Если ордер открыл данный советник, то входим в условие if(OrderSymbol() == Symbol() && OrderMagicNumber() == iMag) { // Если Стоп Лосс текущего ордера равен нулю, то модифицируем ордер if(dOSL == 0) { if(iOTy == OP_BUY) { dSL = NormalizeDouble(dOOP - StopLoss * Point, Digits); dTP = NormalizeDouble(dOOP + TakeProfit * Point, Digits); bool bOM = OrderModify(iOTi, dOOP, dSL, dTP, 0, clrNONE); } if(iOTy == OP_SELL) { dSL = NormalizeDouble(dOOP + StopLoss * Point, Digits); dTP = NormalizeDouble(dOOP - TakeProfit * Point, Digits); bool bOM = OrderModify(iOTi, dOOP, dSL, dTP, 0, clrNONE); } } } } //+-----------------------------------------------------------------------------------------------+ //| Функция обработки ошибок | //+-----------------------------------------------------------------------------------------------+ void vError(int iErr) { switch(iErr) { case 129: // Неправильная цена case 135: // Цена изменилась case 136: // Нет цен case 138: // Новые цены Sleep(1000); RefreshRates(); break; case 137: // Брокер занят case 146: // Подсистема торговли занята Sleep(3000); RefreshRates(); break; } } //+-----------------------------------------------------------------------------------------------+ double LOT() { int n=0; int m=0; int v=0; double OL=Lot; for (int j = OrdersHistoryTotal()-1; j >= 0; j--) { if (OrderSelect(j, SELECT_BY_POS,MODE_HISTORY)) { if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) { if (OrderProfit()>0) { if (n==0) OL=NormalizeDouble(OrderLots()+K_Martin1,DigitsLot); n++; if ((OL>=MaxMartinLot)&& (m==0)) OL=NormalizeDouble(OrderLots()*K_Martin2,DigitsLot); m++; if ((OL>=MaxMartinLot2) && (v==0)) OL=NormalizeDouble(OrderLots()*K_Martin3,DigitsLot); v++; } else { if (n==0) {return(Lot);} else {return(OL);} } } } } return(OL); }Mihail Matkovskij#: 这将错过信号 законопослушный гражданин 2021.12.08 11:27 #18002 MakarFX #: 这将使信号通过。 谢谢,我将同时尝试。 Ivan Butko 2021.12.08 11:28 #18003 请告知。1.MT5中的多重测试是如何安排的:根据总时间,每个货币对轮流或平行进行(模仿真实的多货币交易)。2.在MT4的策略测试器中,是否可以使用其他货币对的指标数据? aleksan2021 2021.12.08 11:37 #18004 你能告诉我为什么每次我在真实点上测试EA时(时间框架和经纪商是相同的),MT5终端每次都从经纪商那里下载相同的数据?mt5不是应该下载一次这个数据,然后再从我的电脑上下载吗? законопослушный гражданин 2021.12.08 12:17 #18005 законопослушный гражданин #:谢谢,我将同时尝试。 两种变体都可以使用!哪一种更好?) Valeriy Yastremskiy 2021.12.08 12:22 #18006 Ivan Butko 多货币交易)。 2.在MT4的策略测试器中,是否可以使用其他货币对的指标数据? 2.是的,但成对的数据应该预装在报价档案中,并且只能从你加载的区间开始使用,对于每个TF,它们的日期是不同的。对于1分钟对5个月最多。不能下单,但可以从条形图中获得数据,从而获得指标。蜱虫数据也不存在。 Tretyakov Rostyslav 2021.12.08 12:23 #18007 законопослушный гражданин #:两辆车都能用!哪辆更好?) 米哈伊尔的变体将只在新蜡烛的第一个刻度上检查信号,如果信号晚于第一个刻度--专家顾问将错过它。 законопослушный гражданин 2021.12.08 12:27 #18008 MakarFX #: 米哈伊尔的变体将只在新蜡烛的第一个刻度上检查信号,如果信号晚于第一个刻度--专家顾问将错过它。 那么,根据迈克尔的版本,这个测试应该会导致同期的订单减少? Tretyakov Rostyslav 2021.12.08 12:30 #18009 законопослушный гражданин #:那么,根据迈克尔的版本,这个测试应该会导致同期的订单减少? 可能是这样。 Ivan Butko 2021.12.08 12:57 #18010 Valeriy Yastremskiy #:2.是的,但这些货币对需要预先加载到报价档案中,并且只能从下载的区间中获得,对于每个TF不同的日期。对于一分钟的酒吧5个月,通常不会再多。对于每个订单,不能下单,但可以从条形图中获得数据,因此也可以从指标中获得。我也没有打勾的数据。 谢谢 1...179417951796179717981799180018011802180318041805180618071808...1953 新评论 原因: 取消 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
对不起,我第二次提出这个问题了。
这将使信号通过。
谢谢,我将同时尝试。
谢谢,我将同时尝试。
两种变体都可以使用!哪一种更好?)
2.是的,但成对的数据应该预装在报价档案中,并且只能从你加载的区间开始使用,对于每个TF,它们的日期是不同的。对于1分钟对5个月最多。不能下单,但可以从条形图中获得数据,从而获得指标。蜱虫数据也不存在。
两辆车都能用!哪辆更好?)
米哈伊尔的变体将只在新蜡烛的第一个刻度上检查信号,如果信号晚于第一个刻度--专家顾问将错过它。
那么,根据迈克尔的版本,这个测试应该会导致同期的订单减少?
那么,根据迈克尔的版本,这个测试应该会导致同期的订单减少?
2.是的,但这些货币对需要预先加载到报价档案中,并且只能从下载的区间中获得,对于每个TF不同的日期。对于一分钟的酒吧5个月,通常不会再多。对于每个订单,不能下单,但可以从条形图中获得数据,因此也可以从指标中获得。我也没有打勾的数据。
谢谢