Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 1781 1...177417751776177717781779178017811782178317841785178617871788...1953 Nuovo commento законопослушный гражданин 2021.12.03 11:34 #17801 MakarFX #:Ancora una volta, sottolineo la differenza 1 variante 2 variante. Sì, grazie. Ho capito. законопослушный гражданин 2021.12.03 11:35 #17802 Mihail Matkovskij #:Cercate di capire cosa state codificando piuttosto che copiare ciecamenteOrdersTotal,OrdersHistoryTotal, OrderSelect Ci proverò. законопослушный гражданин 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; } ha rifatto la parte void OnTick() in modo che quando si raggiunge un certo lotto (LotControl), un determinato numero di punti viene aggiunto al segnale (il parametro Deviation) Di conseguenza, funziona con problemi: in primo luogo i test sulla storia hanno iniziato a fermarsi quasi dopo 500 scambi (1-2 scambi al minuto). (inizia con una velocità normale, e poi va sempre più lentamente) In secondo luogo, la deviazione si collega non dopo (LotControl) ma in uno o due passi dopo il lotto specificato. [Qualsiasi domanda da principiante, Chiarificazione sostanziale???? imparare a guadagnare soldi Tretyakov Rostyslav 2021.12.03 14:17 #17804 законопослушный гражданин #:ha rifatto la parte void OnTick() in modo che quando si raggiunge un certo lotto (LotControl), un determinato numero di punti viene aggiunto al segnale (il parametro Deviation) Di conseguenza, funziona con problemi: in primo luogo i test sulla storia hanno iniziato a fermarsi quasi dopo 500 scambi (1-2 scambi al minuto). (inizia con una velocità normale, e poi va sempre più lentamente) In secondo luogo, la deviazione si collega non dopo (LotControl), ma uno o due passi dopo il lotto specificato. Prova in questo modo: rimuovere da 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; e mettere qui //+-----------------------------------------------------------------------------------------------+ //| Функция поиска сигнала на покупку | //+-----------------------------------------------------------------------------------------------+ 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 #:Prova in questo modo: rimuovere da void OnTick() e mettere qui il risultato sarà lo stesso. Non si tratta del segnale. Ho altri due EA simili a questo, e non ci sono freni законопослушный гражданин 2021.12.03 15:00 #17806 MakarFX #:Prova in questo modo: rimuovere da void OnTick() e metterlo qui All'inizio ero preoccupato per questa cosa: 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; } ma gli altri due gufi funzionano bene con esso sul tester Tretyakov Rostyslav 2021.12.03 15:16 #17807 законопослушный гражданин #:All'inizio pensavo fosse questa cosa: Non c'è niente di sbagliato in questa cosa. Guarderò il tuo codice più tardi, scrivi quale periodo stai usando nel tester e quale coppia. Controllerò per vedere se sta rallentando per me. Chiarimenti dall'amministrazione Indicatori multi timeframe Strategia BLODIUM - Lavoro законопослушный гражданин 2021.12.03 15:34 #17808 MakarFX #:Non c'è niente di sbagliato in questa cosa. Darò un'occhiata al tuo codice più tardi, posta quale timeframe stai usando nel tester e quale coppia. Controllerò se sto rallentando. Sì, qualsiasi coppia. Uso M15 per AUD/USD. Ho avuto lo stesso problema con il tuo indicatore (allegato) Ho scoperto con il metodo dell'eliminazione che è questa cosa che mi rallenta: 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); } File: Citizen.v2.1_-_powhn.mq4 35 kb Tretyakov Rostyslav 2021.12.03 17:24 #17809 законопослушный гражданин #:Sì, qualsiasi coppia. Uso M15 per AUD/USD. Ho avuto lo stesso problema con il tuo indicatore (allegato) Ho scoperto per eliminazione che è questa cosa che rallenta il processo: Cambia l'override dell'ordine for (int i= OrdersHistoryTotal()-1; i>= 0; i--) Artyom Trishkin 2021.12.03 17:58 #17810 MakarFX #:Cambiare l'overshoot degli ordini Ragazzi, per quanto possiate, se non ricordate il valore dell'indice del ciclo all'ultimo controllo, allora avete un ciclo che attraversa tutta la storia disponibile. E più ce n'è, più lungo è il ciclo. Domande dai principianti MQL4 AIUTARE CHI PUÒ!!! FOREX - Tendenze, previsioni 1...177417751776177717781779178017811782178317841785178617871788...1953 Nuovo commento
Ancora una volta, sottolineo la differenza
1 variante
2 variante.
Sì, grazie. Ho capito.
Cercate di capire cosa state codificando piuttosto che copiare ciecamenteOrdersTotal,OrdersHistoryTotal,
OrderSelect
Ci proverò.
ha rifatto la parte void OnTick()
in modo che quando si raggiunge un certo lotto (LotControl), un determinato numero di punti viene aggiunto al segnale (il parametro Deviation)
Di conseguenza, funziona con problemi:
in primo luogo i test sulla storia hanno iniziato a fermarsi quasi dopo 500 scambi (1-2 scambi al minuto).
(inizia con una velocità normale, e poi va sempre più lentamente)
In secondo luogo, la deviazione si collega non dopo (LotControl) ma in uno o due passi dopo il lotto specificato.
ha rifatto la parte void OnTick()
in modo che quando si raggiunge un certo lotto (LotControl), un determinato numero di punti viene aggiunto al segnale (il parametro Deviation)
Di conseguenza, funziona con problemi:
in primo luogo i test sulla storia hanno iniziato a fermarsi quasi dopo 500 scambi (1-2 scambi al minuto).
(inizia con una velocità normale, e poi va sempre più lentamente)
In secondo luogo, la deviazione si collega non dopo (LotControl), ma uno o due passi dopo il lotto specificato.
Prova in questo modo:
rimuovere da void OnTick()
e mettere qui
Prova in questo modo:
rimuovere da void OnTick()
e mettere qui
il risultato sarà lo stesso.
Non si tratta del segnale. Ho altri due EA simili a questo, e non ci sono freni
Prova in questo modo:
rimuovere da void OnTick()
e metterlo qui
All'inizio ero preoccupato per questa cosa:
ma gli altri due gufi funzionano bene con esso sul tester
All'inizio pensavo fosse questa cosa:
Non c'è niente di sbagliato in questa cosa.
Guarderò il tuo codice più tardi, scrivi quale periodo stai usando nel tester e quale coppia. Controllerò per vedere se sta rallentando per me.
Non c'è niente di sbagliato in questa cosa.
Darò un'occhiata al tuo codice più tardi, posta quale timeframe stai usando nel tester e quale coppia. Controllerò se sto rallentando.
Sì, qualsiasi coppia.
Uso M15 per AUD/USD.
Ho avuto lo stesso problema con il tuo indicatore (allegato)
Ho scoperto con il metodo dell'eliminazione che è questa cosa che mi rallenta:
Sì, qualsiasi coppia.
Uso M15 per AUD/USD.
Ho avuto lo stesso problema con il tuo indicatore (allegato)
Ho scoperto per eliminazione che è questa cosa che rallenta il processo:
Cambia l'override dell'ordine
Cambiare l'overshoot degli ordini
Ragazzi, per quanto possiate, se non ricordate il valore dell'indice del ciclo all'ultimo controllo, allora avete un ciclo che attraversa tutta la storia disponibile. E più ce n'è, più lungo è il ciclo.