Nutze bitte den Code Button beim Einfügen von Code.
bitte nochmal das ganze
bool OrderCheck( MqlTradeRequest& request, // Struktur der Anforderung MqlTradeCheckResult& result // Struktur der Antwort ); input double LossMM=0.1; // Losses from the balance when Stop Loss is triggered input uint DEVIATION=10; // Price deviation input uint STOPLOSS=300; // Stop Loss in points from the current price input uint TAKEPROFIT=800; // Take Profit in points from the current price input uint RTOTAL=4; // Number of retries when the deals are failed input uint SLEEPTIME=1; void OnTick() { //Erstelle jeweils ein Array für Preisdaten double MeinGleitenderdurschnitt1[],MeinGleitenderdurschnitt2[],MeinGleitenderdurschnitt3[]; double Ask=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits); double Bid=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits); double Balance=AccountInfoDouble(ACCOUNT_BALANCE); double Equity=AccountInfoDouble(ACCOUNT_EQUITY); // Definiere Eigenschaften für Meine Gleitendendurschnitte int GleitenderDurschnittDefinition1 = iMA (_Symbol,_Period,4,0,MODE_SMA,PRICE_CLOSE); int GleitenderDurschnittDefinition2 = iMA (_Symbol,_Period,9,0,MODE_SMA,PRICE_CLOSE); int GleitenderDurschnittDefinition3 = iMA (_Symbol,_Period,18,0,MODE_SMA,PRICE_CLOSE); // Sotiert die Preisdaten für 3 Durschnitte absteigen!! ArraySetAsSeries(MeinGleitenderdurschnitt1,true); ArraySetAsSeries(MeinGleitenderdurschnitt2,true); ArraySetAsSeries(MeinGleitenderdurschnitt3,true); // Definition1,2 und 3, Eine Linie, aktuell 3 Kerzen, Resultat speichern CopyBuffer(GleitenderDurschnittDefinition1,0,0,3,MeinGleitenderdurschnitt1); CopyBuffer(GleitenderDurschnittDefinition2,0,0,3,MeinGleitenderdurschnitt2); CopyBuffer(GleitenderDurschnittDefinition3,0,0,3,MeinGleitenderdurschnitt3); //wenn keine offenen Positionen existieren if (OrdersTotal()==0) if ( // wenn die 4 und 9 durch 18er nach oben bricht dann kaufen (MeinGleitenderdurschnitt1[0]>MeinGleitenderdurschnitt3[0]) && (MeinGleitenderdurschnitt2[1]>MeinGleitenderdurschnitt3[1]) ) { trade.Sell(0.01,NULL,Ask,40,(Ask-40 * _Point),NULL); } if ( // wenn die 4 und 9 durch 18er nach unten bricht verkaufen (MeinGleitenderdurschnitt1[0]<MeinGleitenderdurschnitt3[0]) && (MeinGleitenderdurschnitt2[1]<MeinGleitenderdurschnitt3[1]) ) { trade.Buy(0.01,NULL,Ask,40,(Ask-40 * _Point),NULL); } } Dazu der Fehlercode: 'trade' - undeclared identifier MA Chris.mq5 50 10 'trade' - undeclared identifier MA Chris.mq5 60 10
CTrade - die geeignete Klasse für Handelsoperationen Der Handel erfolgt in MQL5 lediglich durch zwei Funktionen, OrderSend() und OrderSendAsync(). Eigentlich handelt es sich dabei jedoch nur um zwei unterschiedliche Umsetzungen einer einzigen Funktion. Während OrderSend() eine Handelsanfrage abschickt und auf das Ergebnis von deren Erfüllung wartet, schickt die asynchrone Funktion OrderSendAsync() die Anfrage einfach ab und gestattet dem Programm weiterzuarbeiten, ohne auf eine Antwort des Handelsservers zu warten. Es ist also wirklich einfach, in MQL5 zu handeln, da eine Funktion für alle Handelsoperationen reicht. Worin besteht dann die Herausforderung? Beide Funktionen erhalten als ersten Parameter das Gerüst MqlTradeRequest mit über zehn Feldern. Dabei müssen nicht unbedingt alle Felder gefüllt werden. Die Auswahl der erforderlichen Felder hängt von der Art der Handelsoperation ab. Die Angabe eines falschen Wertes oder ein freigelassenes Pflichtfeld führt zu einem Fehler, und die Anfrage wird schlicht nicht an den Server verschickt. 5 dieser Felder erfordern die Angabe korrekter Werte aus vorgegebenen Aufzählungen. Diese große Zahl Felder ist durch die Notwendigkeit bedingt, in einer Handelsanfrage zahlreiche Eigenschaften des Auftrags anzugeben. Diese können wiederum je nach Ausführungsweise, Ablaufzeit und anderen Parametern variieren. Aber Sie müssen all diese Feinheiten nicht unbedingt lernen. Verwenden Sie einfach die vorgefertigte Klasse CTrade. In etwa folgendermaßen kann ihre Anwendung in Ihrem automatischen Handelssystem aussehen: #include<Trade\Trade.mqh> //--- object for performing trade operations CTrade trade; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- set MagicNumber for your orders identification int MagicNumber=123456; trade.SetExpertMagicNumber(MagicNumber); //--- set available slippage in points when buying/selling int deviation=10; trade.SetDeviationInPoints(deviation); //--- order filling mode, the mode allowed by the server should be used trade.SetTypeFilling(ORDER_FILLING_RETURN); //--- logging mode: it would be better not to declare this method at all, the class will set the best mode on its own trade.LogLevel(1); //--- what function is to be used for trading: true - OrderSendAsync(), false - OrderSend() trade.SetAsyncMode(true); //--- return(0); } Jetzt ist der richtige Zeitpunkt, um zu sehen, wie CTrade Handelsoperationen unterstützt. Kauf/Verkauf zum aktuellen Kurs Häufig muss der Kauf oder Verkauf zum aktuellen Kurs in Handelsstrategien umgehend abgeschlossen werden. CTrade ist damit vertraut und fragt lediglich nach dem erforderlichen Umfang der Handelsoperation. Alle übrigen Parameter (der Eröffnungskurs, die Bezeichnung des Kürzels, die Stop Loss- und Take Profit-Grenzen sowie die Kommentare zu dem Auftrag) können weggelassen werden. //--- 1. example of buying at the current symbol if(!trade.Buy(0.1)) { //--- failure message Print("Buy() method failed. Return code=",trade.ResultRetcode(), ". Code description: ",trade.ResultRetcodeDescription()); } else { Print("Buy() method executed successfully. Return code=",trade.ResultRetcode(), " (",trade.ResultRetcodeDescription(),")"); } Als Voreinstellung verwendet CTrade die Bezeichnung des Kürzels, in dessen Diagramm sie aufgerufen wird, sofern keine andere Kürzelbezeichnung angegeben ist. Das ist bei einfachen Strategien recht angenehm. Bei Strategien mit mehreren Währungen muss das jeweilige Kürzel, für das die Handelsoperation ausgeführt werden soll, jedes Mal ganz genau angegeben werden. //--- 2. example of buying at the specified symbol if(!trade.Buy(0.1,"GBPUSD")) { //--- failure message Print("Buy() method failed. Return code=",trade.ResultRetcode(), ". Code description: ",trade.ResultRetcodeDescription()); } else { Print("Buy() method executed successfully. Return code=",trade.ResultRetcode(), " (",trade.ResultRetcodeDescription(),")"); } Es können alle Auftragsparameter angegeben werden: Die Stop Loss-/Take Profit-Grenze, der Eröffnungskurs und die Kommentare. //--- 3. example of buying at the specified symbol with specified SL and TP double volume=0.1; // specify a trade operation volume string symbol="GBPUSD"; //specify the symbol, for which the operation is performed int digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS); // number of decimal places double point=SymbolInfoDouble(symbol,SYMBOL_POINT); // point double bid=SymbolInfoDouble(symbol,SYMBOL_BID); // current price for closing LONG double SL=bid-1000*point; // unnormalized SL value SL=NormalizeDouble(SL,digits); // normalizing Stop Loss double TP=bid+1000*point; // unnormalized TP value TP=NormalizeDouble(TP,digits); // normalizing Take Profit //--- receive the current open price for LONG positions double open_price=SymbolInfoDouble(symbol,SYMBOL_ASK); string comment=StringFormat("Buy %s %G lots at %s, SL=%s TP=%s", symbol,volume, DoubleToString(open_price,digits), DoubleToString(SL,digits), DoubleToString(TP,digits)); if(!trade.Buy(volume,symbol,open_price,SL,TP,comment)) { //--- failure message Print("Buy() method failed. Return code=",trade.ResultRetcode(), ". Code description: ",trade.ResultRetcodeDescription()); } else { Print("Buy() method executed successfully. Return code=",trade.ResultRetcode(), " (",trade.ResultRetcodeDescription(),")"); }
Schau dir den Text und den Code dazu an.
Dann siehst du was dir fehlt.
Gruß
Ui, der Code sieht sehr nach Raimund Bauer (YT) aus.
Der löscht immer alles oberhalb der OnTick() Funktion, weil er damit anscheinend nix anfangen kann.
Ein Handle zu einem Indikator zu erstellen ist aber ein relativ langsamer Vorgang und gehört deshalb in die OnInit() Funktion.
Es ändert sich ja auch weiter nichts an dieser Definition. Also bitte NICHT in die OnTick().
Christian hat dir da guten Quelltext gepostet. Die System-Library zu verwenden erspart viel Arbeit.
Grüße, Otto
Vielen dank für eure Hilfe.
Ja dieser Code kommt von YT auch von Raimund Bauer.
Jetzt fehlt nur das er nur einmal Tradet pro Signal und nicht wie jetzt 6000 Tickets eröffnet.

- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Hallo bin ziemlich neu hier.
Daher meine Frage. Was fehlen hier für Parameter zum ausführen der Handelsoptionen.
bool OrderCheck(
MqlTradeRequest& request, // Struktur der Anforderung
MqlTradeCheckResult& result // Struktur der Antwort
);
input double LossMM=0.1; // Losses from the balance when Stop Loss is triggered
input uint DEVIATION=10; // Price deviation
input uint STOPLOSS=300; // Stop Loss in points from the current price
input uint TAKEPROFIT=800; // Take Profit in points from the current price
input uint RTOTAL=4; // Number of retries when the deals are failed
input uint SLEEPTIME=1;
void OnTick()
{
//Erstelle jeweils ein Array für Preisdaten
double MeinGleitenderdurschnitt1[],MeinGleitenderdurschnitt2[],MeinGleitenderdurschnitt3[];
double Ask=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
double Bid=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);
double Balance=AccountInfoDouble(ACCOUNT_BALANCE);
double Equity=AccountInfoDouble(ACCOUNT_EQUITY);
// Definiere Eigenschaften für Meine Gleitendendurschnitte
int GleitenderDurschnittDefinition1 = iMA (_Symbol,_Period,4,0,MODE_SMA,PRICE_CLOSE);
int GleitenderDurschnittDefinition2 = iMA (_Symbol,_Period,9,0,MODE_SMA,PRICE_CLOSE);
int GleitenderDurschnittDefinition3 = iMA (_Symbol,_Period,18,0,MODE_SMA,PRICE_CLOSE);
// Sotiert die Preisdaten für 3 Durschnitte absteigen!!
ArraySetAsSeries(MeinGleitenderdurschnitt1,true);
ArraySetAsSeries(MeinGleitenderdurschnitt2,true);
ArraySetAsSeries(MeinGleitenderdurschnitt3,true);
// Definition1,2 und 3, Eine Linie, aktuell 3 Kerzen, Resultat speichern
CopyBuffer(GleitenderDurschnittDefinition1,0,0,3,MeinGleitenderdurschnitt1);
CopyBuffer(GleitenderDurschnittDefinition2,0,0,3,MeinGleitenderdurschnitt2);
CopyBuffer(GleitenderDurschnittDefinition3,0,0,3,MeinGleitenderdurschnitt3);
//wenn keine offenen Positionen existieren
if (OrdersTotal()==0)
if ( // wenn die 4 und 9 durch 18er nach oben bricht dann kaufen
(MeinGleitenderdurschnitt1[0]>MeinGleitenderdurschnitt3[0])
&& (MeinGleitenderdurschnitt2[1]>MeinGleitenderdurschnitt3[1])
)
{
trade.Sell(0.01,NULL,Ask,40,(Ask-40 * _Point),NULL);
}
if ( // wenn die 4 und 9 durch 18er nach unten bricht verkaufen
(MeinGleitenderdurschnitt1[0]<MeinGleitenderdurschnitt3[0])
&& (MeinGleitenderdurschnitt2[1]<MeinGleitenderdurschnitt3[1])
)
{
trade.Buy(0.01,NULL,Ask,40,(Ask-40 * _Point),NULL);
}
}
Dazu der Fehlercode: 'trade' - undeclared identifier MA Chris.mq5 50 10