Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools
Zurück   Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools > Metatrader 4 > Programmierung MQL4
Startseite Registrieren Hilfe Community Kalender Heutige Beiträge Suchen

Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4.

Login
Benutzername:
Kennwort:


Statistik
Themen: 4978
Beiträge: 43297
Benutzer: 7.224
Aktive Benutzer: 74
Links: 84
Wir begrüßen unseren neuesten Benutzer: Sundaytrader
Mit 2.475 Benutzern waren die meisten Benutzer gleichzeitig online (16.01.20 um 22:38).
Neue Benutzer:
vor 12 Stunden
- Sundaytrad...
vor 19 Stunden
- TS_6
vor 2 Tagen
- Mane
vor 2 Wochen
- AlbertZiz
vor 2 Wochen
- michak

Onlineuser
'Wer ist online' anzeigen Benutzer: 0
Gäste: 413
Gesamt: 413
Team: 0
Team:  
Benutzer:  
Freunde anzeigen

Empfehlungen

Thema geschlossen
 
Themen-Optionen Thema durchsuchen Ansicht
  #1 (permalink)  
Alt 21.03.18
Neues Mitglied
 
Registriert seit: May 2015
Beiträge: 12
deadlef befindet sich auf einem aufstrebenden Ast
Standard MQL Market Validierung

Hallo,

ich wollte einen EA bei mql im market verkaufen bzw zur verfügung stellen. Jetzt gibt es dort aber einen Validierungsprozess. Mein Ea läuft soweit im Strategietester und compiler ohne Fehler. Allerdings wird vom mql market folgendes im code gebraucht zur überprüfung.

https://www.mql5.com/de/articles/2555#not_enough_money
https://www.mql5.com/de/articles/2555#invalid_lot

Folgende Funktionen werden zur Verfügung gestellt.

PHP-Code:
bool CheckMoneyForTrade(string symbdouble lots,int type)
  {
   
double free_margin=AccountFreeMarginCheck(symb,type,lots);
   
//-- wenn es Geldmittel nicht ausreichend sind
   
if(free_margin<0)
     {
      
string oper=(type==OP_BUY)? "Buy":"Sell";
      Print(
"Not enough money for "oper," ",lots" "symb" Error code=",GetLastError());
      return(
false);
     }
   
//-- die Überprüfung ist erfolgreich gelaufen
   
return(true);
  } 
Bloß wie führe ich diese aus.

Genauso wie dieses hier:
PHP-Code:
//+------------------------------------------------------------------+
//|  Überprüft den Volumen der Order auf die Korrektheit             |
//+------------------------------------------------------------------+
bool CheckVolumeValue(double volume,string &description)
  {
//--- der minimale erlaubte Volumens für die Handelsoperationen
   
double min_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
   if(
volume<min_volume)
     {
      
description=StringFormat("der Volumen ist weniger den minimalen erlaubten SYMBOL_VOLUME_MIN=%.2f",min_volume);
      return(
false);
     }

//--- der maximale erlaubte Volumens für die Handelsoperationen
   
double max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
   if(
volume>max_volume)
     {
      
description=StringFormat("der Volumen ist mehr den maximalen erlaubten SYMBOL_VOLUME_MAX=%.2f",max_volume);
      return(
false);
     }

//--- wir bekommen die minimale Gradation des Volumens
   
double volume_step=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP);

   
int ratio=(int)MathRound(volume/volume_step);
   if(
MathAbs(ratio*volume_step-volume)>0.0000001)
     {
      
description=StringFormat("Der Volumen ist divisibel der minimalen Gradation SYMBOL_VOLUME_STEP=%.2f, des nächsten korrekten Volumens %.2f",
                               
volume_step,ratio*volume_step);
      return(
false);
     }
   
description="Der korrekte Wert des Volumens";
   return(
true);
  } 

Reicht es aus nur die Funktionen einzubinden?
  #2 (permalink)  
Alt 21.03.18
AVT AVT ist offline
Elite Mitglied
 
Registriert seit: Mar 2018
Ort: Hamburg
Beiträge: 612
AVT befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von deadlef Beitrag anzeigen
ich wollte einen EA bei mql im market verkaufen bzw zur verfügung stellen. Jetzt gibt es dort aber einen Validierungsprozess. Mein Ea läuft soweit im Strategietester und compiler ohne Fehler. Allerdings wird vom mql market folgendes im code gebraucht zur überprüfung.

Folgende Funktionen werden zur Verfügung gestellt.
snip ... snip
Bloß wie führe ich diese aus.
Genauso wie dieses hier: snip ... snip
Reicht es aus nur die Funktionen einzubinden?
Wenn Du mit einbinden meinst, einfach nur in den EA reinkopieren: nein.
Du mußt die Funktionen schon immer dann benutzen/aufrufen, wenn sie benötigt werden, z.B. wenn eine Order aufgegeben werden soll, muß vor der Order erst mal überprüft werden, ob genug Geld da ist, ob die Angaben über die Lots erlaubt sind, ... halt der ganze Schwanz möglicher Quellen, die eine erfolgreiche Orderaufgabe verhindern würden.

PHP-Code:
description=StringFormat("der Volumen ist weniger den minimalen erlaubten SYMBOL_VOLUME_MIN=%.2f",min_volume);

description=StringFormat("der Volumen ist mehr den maximalen erlaubten SYMBOL_VOLUME_MAX=%.2f",max_volume);

description=StringFormat("Der Volumen ist divisibel der minimalen Gradation SYMBOL_VOLUME_STEP=%.2f, des nächsten korrekten Volumens %.2f",
                               
volume_step,ratio*volume_step); 
Aber tue den Benutzern den Gefallen und schreibe verständliche Meldungen. Der ganze mql5 online Teil ist eine Computerübersetzung mit all ihren Fehlern. Als Benutzer kann ich mit "Der Volumen ist divisibel der minimalen Gradation" NULL anfangen!

Ich hoffe, das beantwortet Deine Fragen. AVT
  #3 (permalink)  
Alt 21.03.18
Neues Mitglied
 
Registriert seit: May 2015
Beiträge: 12
deadlef befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von AVT Beitrag anzeigen
Wenn Du mit einbinden meinst, einfach nur in den EA reinkopieren: nein.
Du mußt die Funktionen schon immer dann benutzen/aufrufen, wenn sie benötigt werden, z.B. wenn eine Order aufgegeben werden soll, muß vor der Order erst mal überprüft werden, ob genug Geld da ist, ob die Angaben über die Lots erlaubt sind, ... halt der ganze Schwanz möglicher Quellen, die eine erfolgreiche Orderaufgabe verhindern würden.

PHP-Code:
description=StringFormat("der Volumen ist weniger den minimalen erlaubten SYMBOL_VOLUME_MIN=%.2f",min_volume);

description=StringFormat("der Volumen ist mehr den maximalen erlaubten SYMBOL_VOLUME_MAX=%.2f",max_volume);

description=StringFormat("Der Volumen ist divisibel der minimalen Gradation SYMBOL_VOLUME_STEP=%.2f, des nächsten korrekten Volumens %.2f",
                               
volume_step,ratio*volume_step); 
Aber tue den Benutzern den Gefallen und schreibe verständliche Meldungen. Der ganze mql5 online Teil ist eine Computerübersetzung mit all ihren Fehlern. Als Benutzer kann ich mit "Der Volumen ist divisibel der minimalen Gradation" NULL anfangen!

Ich hoffe, das beantwortet Deine Fragen. AVT
Meine Order wird mit folgendem code aufgerufen wo und wie implementiere ich denn den kram.

PHP-Code:
void OpenPosition(Signal &signal)
  {
   for(
int attempt=0attempt<TRADE_RETRY_COUNTattempt++)
     {
      
int    ticket     0;
      
int    lastError  0;
      
bool   modified   false;
      
int    command    OrderDirectionToCommand(signal.Direction);
      
double amount     Entry_Amount;
      
double stopLoss   signal.StopLossPips>GetStopLoss(commandsignal.StopLossPips) : 0;
      
double takeProfit signal.TakeProfitPips>GetTakeProfit(commandsignal.TakeProfitPips) : 0;
      
string comment    IntegerToString(signal.MagicNumber);
      
color  arrowColor command==OP_BUY clrGreen clrRed;
      
      if(
IsTradeContextFree())
        {
         
double price=MarketInfo(_Symbol,command==OP_BUY MODE_ASK MODE_BID);
         if(
setProtectionSeparately)
           {         
            
ticket=OrderSend(_Symbol,command,amount,price,10,0,0,comment,signal.MagicNumber,0,arrowColor);
            if(
ticket>&& (signal.StopLossPips>|| signal.TakeProfitPips>0))
               
modified=OrderModify(ticket,0,stopLoss,takeProfit,0,clrBlue);
           }
         else
           {
            
ticket=OrderSend(_Symbol,command,amount,price,10,stopLoss,takeProfit,comment,signal.MagicNumber,0,arrowColor);
            
lastError=GetLastError();      
            if(
ticket<=&& lastError==130)
              {
               
ticket=OrderSend(_Symbol,command,amount,price,10,0,0,comment,signal.MagicNumber,0,arrowColor);
               if(
ticket>&& (signal.StopLossPips>|| signal.TakeProfitPips>0))
                  
modified=OrderModify(ticket,0,stopLoss,takeProfit,0,clrBlue);
               if(
ticket>&& modified)
                 {
                  
setProtectionSeparately=true;
                  Print(
"Detected ECN type position protection.");
                 }
              }
           }
        }

      if(
ticket>0) break;

      
lastError=GetLastError();

      if(
lastError!=135 && lastError!=136 && lastError!=137 && lastError!=138) break;

      
Sleep(TRADE_RETRY_WAIT);
      Print(
"Open Position retry no: "+IntegerToString(attempt+2));
     }
  } 
  #4 (permalink)  
Alt 21.03.18
AVT AVT ist offline
Elite Mitglied
 
Registriert seit: Mar 2018
Ort: Hamburg
Beiträge: 612
AVT befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von deadlef Beitrag anzeigen
Meine Order wird mit folgendem code aufgerufen wo und wie implementiere ich denn den kram.
Tut mir leid, das kann ich Dir nicht sagen (allerallerspätestens vor einem OrderSend(...). Der Code sieht nach mql5 aus, das ist nicht mein Metier (mql4 ist schon schwer genug).
Generell kann man ein Programm am besten testen (und ich denke, die werden so etwas ähnliches in einer Validierungsprüfung machen), wenn Du für jede einzelne Eingabe, die ein Benutzer machen kann, totalen Blödsinn reinschreibst.
Nimm ein Demokonto mit max. 500,- Euro (mein erstes hat sogar immer nur 200,-) und dann setz mal Lots=0.138, laß' laufen und guck was passiert. Und was passiert, wenn es 1380 Lots sind. Das für alles was einstellbar ist.
So solltest Du schnell eine Menge Fehler kriegen und auch die genaue Stelle, um sie zu unterbinden. Mehr kann ich Dir leider nicht helfen. AVT
  #5 (permalink)  
Alt 22.03.18
Neues Mitglied
 
Registriert seit: May 2015
Beiträge: 12
deadlef befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von AVT Beitrag anzeigen
Tut mir leid, das kann ich Dir nicht sagen (allerallerspätestens vor einem OrderSend(...). Der Code sieht nach mql5 aus, das ist nicht mein Metier (mql4 ist schon schwer genug).
Generell kann man ein Programm am besten testen (und ich denke, die werden so etwas ähnliches in einer Validierungsprüfung machen), wenn Du für jede einzelne Eingabe, die ein Benutzer machen kann, totalen Blödsinn reinschreibst.
Nimm ein Demokonto mit max. 500,- Euro (mein erstes hat sogar immer nur 200,-) und dann setz mal Lots=0.138, laß' laufen und guck was passiert. Und was passiert, wenn es 1380 Lots sind. Das für alles was einstellbar ist.
So solltest Du schnell eine Menge Fehler kriegen und auch die genaue Stelle, um sie zu unterbinden. Mehr kann ich Dir leider nicht helfen. AVT
das ist ein mql4.

Mein Problem ist die vorgegeben funktionen wie
PHP-Code:
bool CheckMoneyForTrade(string symbdouble lots,int type
  { 
   
double free_margin=AccountFreeMarginCheck(symb,type,lots); 
   
//-- wenn es Geldmittel nicht ausreichend sind 
   
if(free_margin<0
     { 
      
string oper=(type==OP_BUY)? "Buy":"Sell"
      Print(
"Not enough money for "oper," ",lots" "symb" Error code=",GetLastError()); 
      return(
false); 
     } 
   
//-- die Überprüfung ist erfolgreich gelaufen 
   
return(true); 
  } 
wie führe ich die aus.

if(CheckMoneyForTrade==true) ??????
  #6 (permalink)  
Alt 22.03.18
AVT AVT ist offline
Elite Mitglied
 
Registriert seit: Mar 2018
Ort: Hamburg
Beiträge: 612
AVT befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von deadlef Beitrag anzeigen
das ist ein mql4.

Mein Problem ist die vorgegeben funktionen wie
PHP-Code:
bool CheckMoneyForTrade(string symbdouble lots,int type
  { 
   
double free_margin=AccountFreeMarginCheck(symb,type,lots); 
   
//-- wenn es Geldmittel nicht ausreichend sind 
   
if(free_margin<0
     { 
      
string oper=(type==OP_BUY)? "Buy":"Sell"
      Print(
"Not enough money for "oper," ",lots" "symb" Error code=",GetLastError()); 
      return(
false); 
     } 
   
//-- die Überprüfung ist erfolgreich gelaufen 
   
return(true); 
  } 
wie führe ich die aus.

if(CheckMoneyForTrade==true) ??????
So wie Du jede andere Funktion auch aufrufst, Funktion(Arg1,Arg2,...):
Code:
if( CheckMoneyForTrade(Symbol(), // akt. Markt für string symb, 
                       Lots,     // Lotgröße für double lots,
                       OP_BUY)   // Buy oder Sell für int type)
  ) // wenn Check erfolgreich => genug Geld
Das ==true brauchst Du nicht, denn die Funktion liefert ein true bei Erfolg, ist also doppelt gemoppelt. Ich hoffe, so kommst Du weiter. AVT
  #7 (permalink)  
Alt 22.03.18
Neues Mitglied
 
Registriert seit: May 2015
Beiträge: 12
deadlef befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von AVT Beitrag anzeigen
So wie Du jede andere Funktion auch aufrufst, Funktion(Arg1,Arg2,...):
Code:
if( CheckMoneyForTrade(Symbol(), // akt. Markt für string symb, 
                       Lots,     // Lotgröße für double lots,
                       OP_BUY)   // Buy oder Sell für int type)
  ) // wenn Check erfolgreich => genug Geld
Das ==true brauchst Du nicht, denn die Funktion liefert ein true bei Erfolg, ist also doppelt gemoppelt. Ich hoffe, so kommst Du weiter. AVT

muss denn in Lots meine globale variable rein für die lotgröße die man vorher einstellen kann
  #8 (permalink)  
Alt 22.03.18
AVT AVT ist offline
Elite Mitglied
 
Registriert seit: Mar 2018
Ort: Hamburg
Beiträge: 612
AVT befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von deadlef Beitrag anzeigen
muss denn in Lots meine globale variable rein für die lotgröße die man vorher einstellen kann
Sicher, das ist ja schließlich das, was ein Benutzer will: soundsoviel Lots in einem bestimmten Markt handeln. Die Größe legt er vorher fest und dann erwartet er, daß Dein Programm den Rest erledigt. (Und dann hat er sich vertippt, das Ding legt einfach los und schon ist das Konto geschrottet - dumm gelaufen; darum diese ganzen Prüfungen).
Wie Du Deine Variablen nennst, ist Dir ja frei überlassen, nur mußt Du auch in der Lage sein, sie dann an den entsprechenden Stellen einzusetzen. AVT
  #9 (permalink)  
Alt 27.04.18
Neues Mitglied
 
Registriert seit: May 2015
Beiträge: 12
deadlef befindet sich auf einem aufstrebenden Ast
Standard

Folgende Funktion wird nun benutzt
PHP-Code:
bool CheckMoneyForTrade(string symbdouble lots,int type)
  {  
   
double free_margin=AccountFreeMarginCheck(symb,typelots);
   
//-- if there is not enough money
   
if(free_margin<=|| AccountInfoDouble(ACCOUNT_MARGIN_FREE) <=10)
     {
      
string oper=(type==OP_BUY)? "Buy":"Sell";
      Print(
"Not enough money for "oper," ",lots" "symb);
      return(
false);
     }
   
//--- checking successful
   
return(true);
  } 
diese Funktion wird vor dem Ordersend so aufgerufen

PHP-Code:
      if (!CheckMoneyForTrade(_Symbol,Entry_Amount,command)) return;//Check money for trade 
Das kuriose ist nun das es an sich bei Forex Paaren funktioniert. Allerdings bei Gold oder Indizes führt der EA teilweise noch die Ordersend funktion aus und bekommt ein Ordersend error 134.

Kann einer eventuell noch helfen
Thema geschlossen

Lesezeichen

Stichworte
mql4, mqlmarket, mqlmarket validierung, programmierung, programmierung metatrader, programmierung mql4


Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus




Alle Zeitangaben in WEZ +2. Es ist jetzt 07:07 Uhr.





Suchmaschine - Reisen - Wavesnode - Facebook Forum - Spam Firewall
-----------------------------------------------------------------------------------------------------------------------------
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
SEO by vBSEO 3.6.1
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum
MetaTrader bzw. MetaTrader 4 und MetaTrader 5 sind eingetragene Marken der MetaQuotes Software Corp.
-----------------------------------------------------------------------------------------------------------------------------