Hier habe ich einen Fehler gemacht. Warum bekomme ich eine vergrößerte Position?
Es gibt ein Konzept namens Netting. Nach der Philosophie von NETTING erhöhen alle unidirektionalen Trades die Position, während multidirektionale Trades sie schließen, verringern oder umkehren.
Chomtschenko:
Überprüfung anhand des Indikators - wenn es eine Kaufposition geben sollte, aber eine Verkaufsposition vorhanden ist, dann kaufen Sie.
Wenn wir eine Schlussfolgerung aus der Linie ziehen, verstehen wir, dass bei einer bestehenden Verkaufsposition eine neue Kaufposition die bestehende Position schließen oder abschneiden wird.
PS
Übrigens, TP und SL in MT5 sind nach dem letzten Handel gesetzt, so sollten sie auch überwacht werden...
Wie kann ich alle Aufträge mit einem bestimmten Modus löschen?
Ich habe zwei Funktionen dafür, check_orders prüft auf Aufträge mit einem bestimmten Modus, und remove_sl löscht sie:
Das Problem ist, dass ich im Tagebuch meines EA Zeilen wie diese bekomme:
2011.05.11 21:40:19 Trades '726238' : fehlgeschlagene Stornierung der Order #4375237 buy 0.00 at 0.00000 [Ungültige Anfrage] D.h. es werden unnötige Anfragen an den Handelsserver gesendet mit der Bitte, den bereits angeforderten Auftrag zu löschen.
Ich sollte die Liste der Aufträge von oben nach unten durchgehen, z. B:
ЗЫ Если вы знаете инструмент то для поиска позиции совсем не нужно перебирать все позиции, достаточно воспользоваться вот этой функцией:
boolPositionSelect(
string symbol // имя инструмента
);
Ich danke Ihnen. Ich werde es ausprobieren.
Übrigens verwende ich ein Symbol.
Gemäß der Philosophie dieses NETTINGs erhöhen alle unidirektionalen Trades die Position und multidirektionale Trades schließen, verringern oder kehren sie um.
Ganz genau!
Wir schließen aus der Linie, die wir verstehen, dass bei einem bestehenden Verkauf ein neuer Kauf eine bestehende Position schließen oder verkleinern wird.
PS
Übrigens, TP und SL in MT5 sind nach dem letzten Handel gesetzt, so sollten sie auch überwacht werden...
Aus Ihren Worten, HerrInteressant, entnehmeich , dass ich alles richtig verstanden habe.
Ich verwende die gleichen Lose. Ich verwende die gleichen Anschläge. Alles ist so, wie es sein soll. Aber irgendetwas ist falsch!
Ja. Ich versprach, zwei EAs zu erstellen und den Unterschied zu zeigen. Ich werde es tun. Ich möchte nicht das beste Bild für alle zugänglich machen.
Also, wer unter den angesehenen Experten kann ich per E-Mail zwei EAs für die gleiche Strategie auf mql4 und auf mql5?
Ich muss nur herausfinden, was ich falsch mache, das ist alles. Nun, unterschiedliche Preisstatistiken können die Testergebnisse nicht um das 2-3fache verändern. Es geht ums Programmieren.
Lizar,Renat,sergeev, Helft mir. Ich kann Ihnen alle Experten zur Überprüfung des Codes zur Verfügung stellen. Der Expert Advisor ist einfach, aber effektiv. Ich kann es immer noch verbessern, aber ich habe es so weit wie möglich vereinfacht, um das Wesentliche des Problems zu verdeutlichen.
Ich entschuldige mich auch bei allen, die sich in ihren Äußerungen unangemessen verhalten haben. Das ist mir peinlich. Aber ich möchte SEHR gerne alles verstehen!
//+------------------------------------------------------------------+//| M2H1mql5.mq5 |//| Copyright 2011, Yuriy V.Khomtchenko |//| mr.Khomtchenko@gmail.com |//+------------------------------------------------------------------+#property copyright "Copyright 2011, Yuriy V.Khomtchenko"#property link "mr.Khomtchenko@gmail.com"#property version "1.00"MqlRates price[2];
double m_buff_EMAs[];
double m_buff_EMAb[];
double Ask;
double Bid;
int N=2;
double m_handle_ema1, m_handle_ema3;
externdouble Lots = 0.1;
externint Period_MA1=4;
externint Period_MA3=21;
bool mm =0;
bool New_Bar=false;
intconst magic=102406;
double Mas0, Mab0, Mas1, Mab1;
double
StopLoss=200,
TakeProfit=3200;
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit()
{
//---
m_handle_ema1=iMA(_Symbol,_Period,Period_MA1,0,MODE_EMA,PRICE_CLOSE);
m_handle_ema3=iMA(_Symbol,_Period,Period_MA3,0,MODE_EMA,PRICE_CLOSE);
//---return(0);
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick()
{
//---
GetIns();
if (!PositionSelect(_Symbol))
{
if(Mas0>Mab0 && Mas1<Mab1) OpenBuy(Lots,10,"EUR/USD (Buy)",102406);
if(Mas0<Mab0 && Mas1>Mab1) OpenSell(Lots,10,"EUR/USD (Sell)",102406);
}
if (PositionSelect(_Symbol)) TryToClose();
}
//+------------------------------------------------------------------+void GetIns()
{
CopyRates(_Symbol, _Period,0,2,price);
CopyBuffer(m_handle_ema1,0,0,N,m_buff_EMAs);
ArraySetAsSeries(m_buff_EMAs,true);
CopyBuffer(m_handle_ema3,0,0,N,m_buff_EMAb);
ArraySetAsSeries(m_buff_EMAb,true);
Mas0=m_buff_EMAs[0];
Mas1=m_buff_EMAs[1];
Mab0=m_buff_EMAb[0];
Mab1=m_buff_EMAb[1];
MqlTick last_tick;//Здесь будут храниться цены последнего пришедшего тикаSymbolInfoTick(_Symbol,last_tick);//заполняем структуру last_tick последними ценами текущего символа.
Ask=last_tick.ask;//Обновляем переменные Ask и Bid для дальнейшего использования
Bid=last_tick.bid;
return;
}
//Функция открытия длинной (Long) позиции. Указываем также значения переменных по умолчаниюint OpenBuy(double volume,int slippage=10,string comment="EUR/USD (Buy)",int magic0=102406)
{
MqlTradeRequest my_trade;//объявляем структуру типа MqlTradeRequest для формирования запросаMqlTradeResult my_trade_result;//в этой структуре будет ответ сервера на запрос.//далее заполняеем все НЕОБХОДИМЫЕ поля структуры запроса.
my_trade.action=TRADE_ACTION_DEAL;//Установить торговый ордер на немедленное совершение сделки с указанными //параметрами (поставить рыночный ордер)
my_trade.symbol=Symbol();//указываем в качестве валютной пары - текущую валютную пару //(ту, на которой запущен советник)
my_trade.volume=NormalizeDouble(volume,1);//размер лота
my_trade.price=NormalizeDouble(Ask,_Digits);//Цена, при достижении которой ордер должен быть исполнен. //В нашем случае для TRADE_ACTION_DEAL это текущая цена и ее, согласно инструкции указывать не обязательно.
my_trade.sl=NormalizeDouble(Ask-StopLoss*_Point,_Digits);//стоплосс ордера (цена при которой следует закрыть //убыточную сделку)
my_trade.tp=NormalizeDouble(Ask+TakeProfit*_Point,_Digits);//тейкпрофит (цена при которой следует закрыть// прибыльную сделку)
my_trade.deviation=slippage;//проскальзывание в пунктах (при тестировании особой роли не играет, т.к. //проскальзывания не бывает на тестах)
my_trade.type=ORDER_TYPE_BUY;//тип рыночного ордера (покупаем)
my_trade.type_filling=ORDER_FILLING_AON;//Указываем как исполнять ордер. (All Or Nothing - все или ничего) //Сделка может быть совершена исключительно в указанном объеме и по цене равной или лучше указанной в ордере.
my_trade.comment=comment;//комментарий ордера
my_trade.magic=magic;//магическое число ордераResetLastError();//обнуляем код последней ошибки if(OrderSend(my_trade,my_trade_result))//отправляем запрос на открытие позиции. При этом проверяем //успешно ли прошла отправка запроса
{
// Если сервер принял ордер то смортрим на результат Print("Код результата операции - ",my_trade_result.retcode);
}
else
{
//Сервер не принял ордер в нем есть ошибки, выводим их в журналPrint("Код результата операции - ",my_trade_result.retcode);
Print("Ошибка открытия ордера = ",GetLastError());
}
return(0);// Выходим из функции открытия ордера
}
//функция открытия короткой (Short) позиции. Аналогична функции открытия длинной позиции.int OpenSell(double volume,int slippage=10,string comment="Open Short EUR/USD (Sell)",int magic0=102406)
{
MqlTradeRequest my_trade;
MqlTradeResult my_trade_result;
my_trade.action=TRADE_ACTION_DEAL;
my_trade.symbol=Symbol();
my_trade.volume=NormalizeDouble(volume,1);
my_trade.price=NormalizeDouble(Bid,_Digits);
my_trade.sl=NormalizeDouble(Bid+StopLoss*_Point,_Digits);
my_trade.tp=NormalizeDouble(Bid-TakeProfit*_Point,_Digits);
my_trade.deviation=slippage;
my_trade.type=ORDER_TYPE_SELL;
my_trade.type_filling=ORDER_FILLING_AON;
my_trade.comment=comment;
my_trade.magic=magic;
ResetLastError();
if(OrderSend(my_trade,my_trade_result))
{
Print("Код результата операции - ",my_trade_result.retcode);
}
else
{
Print("Код результата операции - ",my_trade_result.retcode);
Print("Ошибка открытия ордера = ",GetLastError());
}
return(0);
}
int TryToClose()
{
if (PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
if(Mas0<Mab0 && Mas1>Mab1) OpenSell(Lots,10,"EUR/USD (Sell)",102406);
if (PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
if(Mas0>Mab0 && Mas1<Mab1) OpenBuy(Lots,10,"EUR/USD (Buy)",102406);
return(0);
}
Das Problem ist, dass diese Zeilen im Tagebuch von EA erscheinen:
2011.05.11 21:40:19 Trades '726238' : fehlgeschlagene Stornierung der Order #4375237 buy 0.00 at 0.00000 [Ungültige Anfrage] D.h. es werden unnötige Anfragen an den Handelsserver gesendet, um den bereits angeforderten Auftrag zu entfernen.
Sie haben Folgendes mitgeteilt:
Sie müssen die Liste der Aufträge von oben nach unten durchgehen, zum Beispiel so:
Ich habe versucht, das zu tun, was Sie gesagt haben, aber das Problem bleibt bestehen - der ausstehende Auftrag wird zuerst gelöscht, dann wird eine weitere Anfrage zum Löschen desselben Auftrags gesendet. Hier ist ein Beispiel für die Protokollzeilen:
2011.05.12 16:42:57 Trades '726238' : cancel order #4388299 buy stop 0.02 EURUSD at 1.41700 done - successfully deleted the order 2011.05.12 16:42:57 Trades '726238' : cancel order #4388299 buy stop 0.02 EURUSD at 1.41700 - Another request is being sent 2011.05.12 16:42:58 Trades '726238' : failed cancel order #4388299 buy 0.00 at 0.00000 [Invalid request] - it was buy for some reason.
Dies geschieht nicht immer, aber manchmal, und es hat keine Auswirkungen auf den Betrieb des Expert Advisors. Ich möchte nur alles richtig machen, den Handelsserver nicht mit leeren Anfragen belasten und das Problem beheben.
Vielen Dank für Ihre Antworten und Ihre Bereitschaft zu helfen.
Hier habe ich einen Fehler gemacht. Warum bekomme ich eine vergrößerte Position?
Es gibt ein Konzept namens Netting. Nach der Philosophie von NETTING erhöhen alle unidirektionalen Trades die Position, während multidirektionale Trades sie schließen, verringern oder umkehren.
Wenn wir eine Schlussfolgerung aus der Linie ziehen, verstehen wir, dass bei einer bestehenden Verkaufsposition eine neue Kaufposition die bestehende Position schließen oder abschneiden wird.
PS
Übrigens, TP und SL in MT5 sind nach dem letzten Handel gesetzt, so sollten sie auch überwacht werden...
Wie kann ich alle Aufträge mit einem bestimmten Modus löschen?
Ich habe zwei Funktionen dafür, check_orders prüft auf Aufträge mit einem bestimmten Modus, und remove_sl löscht sie:
Das Problem ist, dass ich im Tagebuch meines EA Zeilen wie diese bekomme:
2011.05.11 21:40:19 Trades '726238' : fehlgeschlagene Stornierung der Order #4375237 buy 0.00 at 0.00000 [Ungültige Anfrage]
D.h. es werden unnötige Anfragen an den Handelsserver gesendet mit der Bitte, den bereits angeforderten Auftrag zu löschen.
Ich sollte die Liste der Aufträge von oben nach unten durchgehen, z. B:
ЗЫ Если вы знаете инструмент то для поиска позиции совсем не нужно перебирать все позиции, достаточно воспользоваться вот этой функцией:
Ich danke Ihnen. Ich werde es ausprobieren.
Übrigens verwende ich ein Symbol.
Gemäß der Philosophie dieses NETTINGs erhöhen alle unidirektionalen Trades die Position und multidirektionale Trades schließen, verringern oder kehren sie um.
Ganz genau!
Wir schließen aus der Linie, die wir verstehen, dass bei einem bestehenden Verkauf ein neuer Kauf eine bestehende Position schließen oder verkleinern wird.
PS
Übrigens, TP und SL in MT5 sind nach dem letzten Handel gesetzt, so sollten sie auch überwacht werden...
Aus Ihren Worten, HerrInteressant , entnehmeich , dass ich alles richtig verstanden habe.
Ich verwende die gleichen Lose. Ich verwende die gleichen Anschläge. Alles ist so, wie es sein soll. Aber irgendetwas ist falsch!
Ja. Ich versprach, zwei EAs zu erstellen und den Unterschied zu zeigen. Ich werde es tun. Ich möchte nicht das beste Bild für alle zugänglich machen.
Also, wer unter den angesehenen Experten kann ich per E-Mail zwei EAs für die gleiche Strategie auf mql4 und auf mql5?
Ich muss nur herausfinden, was ich falsch mache, das ist alles. Nun, unterschiedliche Preisstatistiken können die Testergebnisse nicht um das 2-3fache verändern. Es geht ums Programmieren.
Lizar,Renat,sergeev, Helft mir. Ich kann Ihnen alle Experten zur Überprüfung des Codes zur Verfügung stellen. Der Expert Advisor ist einfach, aber effektiv. Ich kann es immer noch verbessern, aber ich habe es so weit wie möglich vereinfacht, um das Wesentliche des Problems zu verdeutlichen.
Ich entschuldige mich auch bei allen, die sich in ihren Äußerungen unangemessen verhalten haben. Das ist mir peinlich. Aber ich möchte SEHR gerne alles verstehen!
Sie müssen die Liste der Aufträge von oben nach unten durchgehen, z. B. so:
Es hilft nichts, anscheinend wird die Bestellung erfolgreich gelöscht und dann eine weitere Anfrage gesendet:
2011.05.12 16:42:57 Trades '726238' : cancel order #4388299 buy stop 0.02 EURUSD at 1.41700 done
2011.05.12 16:42:57 Trades '726238' : cancel order #4388299 buy stop 0.02 EURUSD at 1.41700
2011.05.12 16:42:58 Trades '726238' : fehlgeschlagene Stornierung der Order #4388299 buy 0.00 at 0.00000 [Invalid request] - already a buy while buy stop was
ähnlich, aber auf mql4:
Nun, schauen Sie und vergleichen Sie. Ich habe irgendwo gepatzt... Der Unterschied ist erheblich.
Funktioniert nicht, offenbar wird die Bestellung erfolgreich gelöscht und dann eine weitere Anfrage gesendet:
2011.05.12 16:42:57 Trades '726238' : cancel order #4388299 buy stop 0.02 EURUSD at 1.41700 done
2011.05.12 16:42:57 Trades '726238' : cancel order #4388299 buy stop 0.02 EURUSD at 1.41700
2011.05.12 16:42:58 Trades '726238' : fehlgeschlagene Stornierung der Order #4388299 buy 0.00 at 0.00000 [Invalid request] - already a buy while buy stop was
Ich schäme mich zuzugeben, dass ich die Kunst der Telepathie immer noch nicht beherrsche.
Ich werde die Frage wiederholen:
Wie lösche ich korrekt alle Bestellungen mit einem bestimmten Magazin?
Ich habe zwei Funktionen dafür, check_orders prüft auf Aufträge mit einem bestimmten Modus und remove_sl entfernt sie:
Das Problem ist, dass diese Zeilen im Tagebuch von EA erscheinen:
2011.05.11 21:40:19 Trades '726238' : fehlgeschlagene Stornierung der Order #4375237 buy 0.00 at 0.00000 [Ungültige Anfrage]
D.h. es werden unnötige Anfragen an den Handelsserver gesendet, um den bereits angeforderten Auftrag zu entfernen.
Sie haben Folgendes mitgeteilt:
Sie müssen die Liste der Aufträge von oben nach unten durchgehen, zum Beispiel so:
Ich habe versucht, das zu tun, was Sie gesagt haben, aber das Problem bleibt bestehen - der ausstehende Auftrag wird zuerst gelöscht, dann wird eine weitere Anfrage zum Löschen desselben Auftrags gesendet. Hier ist ein Beispiel für die Protokollzeilen:
2011.05.12 16:42:57 Trades '726238' : cancel order #4388299 buy stop 0.02 EURUSD at 1.41700 done - successfully deleted the order
2011.05.12 16:42:57 Trades '726238' : cancel order #4388299 buy stop 0.02 EURUSD at 1.41700 - Another request is being sent
2011.05.12 16:42:58 Trades '726238' : failed cancel order #4388299 buy 0.00 at 0.00000 [Invalid request] - it was buy for some reason.
Dies geschieht nicht immer, aber manchmal, und es hat keine Auswirkungen auf den Betrieb des Expert Advisors. Ich möchte nur alles richtig machen, den Handelsserver nicht mit leeren Anfragen belasten und das Problem beheben.
Vielen Dank für Ihre Antworten und Ihre Bereitschaft zu helfen.