新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 1781 1...177417751776177717781779178017811782178317841785178617871788...1953 新评论 законопослушный гражданин 2021.12.03 11:34 #17801 MakarFX #:我再次强调区别1个变体2个变体。 是的,谢谢你。我知道了。 законопослушный гражданин 2021.12.03 11:35 #17802 Mihail Matkovskij #:试着理解你的编码,而不是盲目地复制OrdersTotal,OrdersHistoryTotal。顺序选择 我会努力的。 законопослушный гражданин 2021.12.03 13:38 #17803 //+-----------------------------------------------------------------------------------------------+ //| Simple Moving Average.mq4 | //| | //+-----------------------------------------------------------------------------------------------+ #property copyright "Copyright 2021" #property link "https://www.mql5.com/ru/users/" #property version "1.00" #property strict // Параметры советника input string sParametersEA = ""; // Параметры советника input double Lot = 0.01; // Количество лотов input double LotControl = 0.01; // Контрольная лотность input int StopLoss = 30; // Уровень убытка input int TakeProfit = 30; // Уровень прибыли input int Deviation = 20; // Отступ цены входа 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 ParametersMA = ""; // Параметры индикатора input int PeriodMA = 14; // Период мувинга input int MovingShift = 1; // Сдвиг мувинга // Глобальные переменные string AC; datetime Start; double dMA; double MaxMartinLot; double MaxMartinLot2; double openPrice; // цена открытия позиции //+-----------------------------------------------------------------------------------------------+ 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(GetLotSize()<LotControl) openPrice = dMA; else openPrice = dMA + Deviation * _Point; // Если нет открытых ордеров, то входим в условие 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 (openPrice > Open[1] && openPrice < Close[1]) //Open[1] и Close[1]- цены открытия и закрытия каждого бара текущего графика. return(true); return(false); } //+-----------------------------------------------------------------------------------------------+ //| Функция поиска сигнала на продажу | //+-----------------------------------------------------------------------------------------------+ bool bSignalSell() { if(openPrice< Open[1] && openPrice > Close[1]) return(true); return(false); } //+-----------------------------------------------------------------------------------------------+ //| Функция открытия ордера на покупку | //+-----------------------------------------------------------------------------------------------+ void vOrderOpenBuy() { // Тикет ордера int iOTi = 0; iOTi = OrderSend(Symbol(), OP_BUY, LOT(), Ask, Slippage, 0, 0, "", Magic, 0, clrNONE); // Проверим открылся ли ордер if(iOTi > 0) // Есди да, то выставим уровни убытка и прибыли vOrderModify(iOTi); else // Если нет, то получим ошибку vError(GetLastError()); } //+-----------------------------------------------------------------------------------------------+ //| Функция открытия ордера на продажу | //+-----------------------------------------------------------------------------------------------+ void vOrderOpenSell() { // Тикет ордера 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()); } //+-----------------------------------------------------------------------------------------------+ //| Функция модификации ордера | //+-----------------------------------------------------------------------------------------------+ 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); } //+------------------------------------------------------------------+ //| Функция считает по символу и магику | //| размер лота с начала цикла | //+------------------------------------------------------------------+ double GetLotSize() { double Ls=0; datetime t=0; int i=OrdersHistoryTotal(); for(int pos=0; pos<i; pos++) { if(OrderSelect(pos, SELECT_BY_POS, MODE_HISTORY)) { if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic) { if(OrderType()==OP_BUY || OrderType()==OP_SELL) { if(t<OrderCloseTime()) {t=OrderCloseTime(); Ls=OrderLots();} } } } } return Ls; } 重做了无效的OnTick()部分 这样,当达到一定的手数时(LotControl),就会在信号中增加指定的点数(偏差参数)。 因此,它的工作有问题。 首先在历史上的测试在500次交易后开始几乎停止(每分钟1-2次交易)。 (开始是正常速度,然后越来越慢) 第二,偏差连接不是在(LotControl)之后,而是在指定批次之后的一到两步。 Tretyakov Rostyslav 2021.12.03 14:17 #17804 законопослушный гражданин #:重做了无效的OnTick()部分这样,当达到一定的手数时(LotControl),就会在信号中增加指定的点数(偏差参数)。因此,它的工作有问题。首先在历史上的测试在500次交易后开始几乎停止(每分钟1-2次交易)。(开始是正常速度,然后越来越慢)第二,偏差连接不是在(LotControl)之后,而是在指定批次之后的一到两步。 这样试试吧。 从void OnTick()中删除 // Получим значение индикатора dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0. if(GetLotSize()<LotControl) openPrice = dMA; else openPrice = dMA + Deviation * _Point; 并放在这里 //+-----------------------------------------------------------------------------------------------+ //| Функция поиска сигнала на покупку | //+-----------------------------------------------------------------------------------------------+ bool bSignalBuy() { dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); openPrice = dMA + Deviation * _Point; if(GetLotSize()<LotControl) openPrice = dMA; if(openPrice > Open[1] && openPrice < Close[1]) //Open[1] и Close[1]- цены открытия и закрытия каждого бара текущего графика. return(true); return(false); } //+-----------------------------------------------------------------------------------------------+ //| Функция поиска сигнала на продажу | //+-----------------------------------------------------------------------------------------------+ bool bSignalSell() { dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); openPrice = dMA + Deviation * _Point; if(GetLotSize()<LotControl) openPrice = dMA; if(openPrice< Open[1] && openPrice > Close[1]) return(true); return(false); } законопослушный гражданин 2021.12.03 14:57 #17805 MakarFX #:这样试试吧。从void OnTick()中删除 并放在这里 其结果将是一样的。 这与信号无关,我还有两个与此相似的EA,没有刹车。 законопослушный гражданин 2021.12.03 15:00 #17806 MakarFX #:这样试试吧。从void OnTick()中删除 并把它放在这里 起初我很担心这件事。 double GetLotSize() { double Ls=0; datetime t=0; int i=OrdersHistoryTotal(); for(int pos=0; pos<i; pos++) { if(OrderSelect(pos, SELECT_BY_POS, MODE_HISTORY)) { if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic) { if(OrderType()==OP_BUY || OrderType()==OP_SELL) { if(t<OrderCloseTime()) {t=OrderCloseTime(); Ls=OrderLots();} } } } } return Ls; } 但其他两只猫头鹰在测试器上工作正常。 Tretyakov Rostyslav 2021.12.03 15:16 #17807 законопослушный гражданин #:起初我以为是这个东西。 这个东西没有什么问题。 我稍后会看一下你的代码,写出你在测试器中使用的时间框架和哪一对。我将检查一下,看看它是否对我来说变慢了。 законопослушный гражданин 2021.12.03 15:34 #17808 MakarFX #:这个东西没有任何问题。我稍后会看看你的代码,贴出你在测试器中使用的时间框架和什么对。我会检查一下,看看我的速度是否变慢了。 是的,任何一对。 我对澳元/美元使用M15。 我在使用你的指标时遇到了同样的问题(附后)。 我通过排除法发现,是这个东西让我的速度变慢了。 double GetProfitFromStart() { double lp=0,cp=0; for(int i=0; i<OrdersHistoryTotal(); i++) { if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic) { if(OrderType()==OP_BUY || OrderType()==OP_SELL) { if(Start<OrderCloseTime()) {lp+=OrderProfit()+OrderCommission()+OrderSwap();} } } } } for(int pos=OrdersTotal()-1;pos>=0;pos--) { if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)) { if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic) { if(OrderType()==OP_BUY || OrderType()==OP_SELL) {cp=OrderProfit()+OrderCommission()+OrderSwap();} } } } return(lp+cp); } 附加的文件: Citizen.v2.1_-_powhn.mq4 35 kb Tretyakov Rostyslav 2021.12.03 17:24 #17809 законопослушный гражданин #:是的,任何一对。我对澳元/美元使用M15。我在使用你的指标时遇到了同样的问题(附后)。我通过排除法发现,是这个东西减慢了进程。 改动顺序覆盖 for (int i= OrdersHistoryTotal()-1; i>= 0; i--) Artyom Trishkin 2021.12.03 17:58 #17810 MakarFX #:改变订单的过冲量 伙计们,尽你所能,如果你不记得最后一次检查时的循环的索引值,那么你有一个循环在所有可用的历史中运行。而且越多,周期越长。 1...177417751776177717781779178017811782178317841785178617871788...1953 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
我再次强调区别
1个变体
2个变体。
是的,谢谢你。我知道了。
试着理解你的编码,而不是盲目地复制OrdersTotal,OrdersHistoryTotal。
顺序选择
我会努力的。
重做了无效的OnTick()部分
这样,当达到一定的手数时(LotControl),就会在信号中增加指定的点数(偏差参数)。
因此,它的工作有问题。
首先在历史上的测试在500次交易后开始几乎停止(每分钟1-2次交易)。
(开始是正常速度,然后越来越慢)
第二,偏差连接不是在(LotControl)之后,而是在指定批次之后的一到两步。
重做了无效的OnTick()部分
这样,当达到一定的手数时(LotControl),就会在信号中增加指定的点数(偏差参数)。
因此,它的工作有问题。
首先在历史上的测试在500次交易后开始几乎停止(每分钟1-2次交易)。
(开始是正常速度,然后越来越慢)
第二,偏差连接不是在(LotControl)之后,而是在指定批次之后的一到两步。
这样试试吧。
从void OnTick()中删除
并放在这里
这样试试吧。
从void OnTick()中删除
并放在这里
其结果将是一样的。
这与信号无关,我还有两个与此相似的EA,没有刹车。
这样试试吧。
从void OnTick()中删除
并把它放在这里
起初我很担心这件事。
但其他两只猫头鹰在测试器上工作正常。
起初我以为是这个东西。
这个东西没有什么问题。
我稍后会看一下你的代码,写出你在测试器中使用的时间框架和哪一对。我将检查一下,看看它是否对我来说变慢了。
这个东西没有任何问题。
我稍后会看看你的代码,贴出你在测试器中使用的时间框架和什么对。我会检查一下,看看我的速度是否变慢了。
是的,任何一对。
我对澳元/美元使用M15。
我在使用你的指标时遇到了同样的问题(附后)。
我通过排除法发现,是这个东西让我的速度变慢了。
是的,任何一对。
我对澳元/美元使用M15。
我在使用你的指标时遇到了同样的问题(附后)。
我通过排除法发现,是这个东西减慢了进程。
改动顺序覆盖
改变订单的过冲量
伙计们,尽你所能,如果你不记得最后一次检查时的循环的索引值,那么你有一个循环在所有可用的历史中运行。而且越多,周期越长。