Metatrader 4 - eine Art Martin Gale EA

Valerius

New member
06. März 2016
6
0
0
Hallo.

Martin-Gale Prinzip hin oder her, hab nen EA für den Metatrader4 der ungefähr nach dem MG-Prinzip ganz alleine Forex traden soll. Einige Test-Tage im Demo-Konto sahn auch nicht schlecht aus. Würde aber vermutlich besser aussehn, wenn er auch funktionieren würde, wie er soll.

Vereinfacht ausgedrückt soll er (ne bestimmte Menge) Orders schließen oder öffnen, wenn Ask / Bid bestimmte Abstände zu OrderOpenPrice() der zuletzt geöffneten Order(s) haben. Ein paar Zähler zählen mit, und wenns nötig scheint, werden z.B. 2x oder 3x so viele Orders in die Gegenrichtung geöffnet, je nach dem, wie der Markt eben läuft. Beim EURUSD z.B. scheint das Alles auch zu funktionieren. aber z.B. beim USD JPY nicht.

Hab die Vermutung, dass NormalizeDouble in der Form nicht reicht, oder er die Magic Numbers vergisst. Vermute eher Erstes, dass diese Dist(anz)-Berechnungen irgendwie nicht richtig berechnet werden. Wie könnte man das besser, und vor Allem richtig machen?

Hier mal der gesamte Code:

/*=============================================================================================================
// N O T I Z E N   U N D   I N F O S
//=============================================================================================================

In dieser Vers. werden keine Tickets benutzt!

OrderSelect wird vermutlich irgendwie
mit MN ++/-- oder ähnlich funktionieren.

//-------------------------------------------------------------------------------------------------------------

//-------------------------------------------------------------------------------------------------------------

In dieser Vers. werden neue Orders geöffnet,
wenn die vorherigen im Gewinn-Bereich sind.

Umgekehrt ist vermutlich nicht so gut...

//-------------------------------------------------------------------------------------------------------------

//=============================================================================================================
// P R O P E R T Y
//============================================================================================================*/
//#property strict
//#ps sorgt anscheinend dafür, dass Kommentare im Konfig-Fenster im MT4 sichtbar sind.
#property copyright"LoShD_MNpm.mq4"
#property copyright"daniel-rudloff@web.de"
//=============================================================================================================
// B E S C H R E I B U N G
//=============================================================================================================
extern string esTOY="true  = on / yes";
extern string esFON="false = off / no";
//-----------------------------------------------------------------------------------------------------------*/
extern string esB01="Open 1.Sell & 1.Buy.";
extern string esB02="If (last) Sell <=";
extern string esB03="( OrderOpenPrice()";
extern string esB04="- D_ONO )";
extern string esB05="open more Sell";
extern string esB06="till";
extern string esB07="1.Sell <=";
extern string esB08="( OrderOpenPrice() - D_CAO ).";
extern string esB09="If (last) Buy >=";
extern string esB10="( OrderOpenPrice()";
extern string esB11="+ D_ONO )";
extern string esB12="open more Buy";
extern string esB13="till";
extern string esB14="1.Buy >=";
extern string esB15="( OrderOpenPrice()";
extern string esB16="+ D_CAO )";
//=============================================================================================================
// E I N S T E L L U N G E N
//=============================================================================================================
extern string esMNF1="Magic Numbers";
extern int MN_FiSel=12;
extern int MN_FiBuy=34;

extern string esMNNSD="MN_NeSel--";
extern int MN_NeSel_def=4999;

extern string esMNNBD="MN_NeBuy++";
extern int MN_NeBuy_def=5001;

//-----------------------------------------------------------------------------------------------------------*/
extern string esOOFT1="Open Orders";
extern string esOOFT2="from/till Hour";
extern string esOOFT3="(Server Time)";
extern int FromH=5;//  Vor 5 Uhr starten scheint sich nicht zu lohnen.
extern int TillH=15;// Zum Testen bis einschließlich 15 Uhr öffnen lassen.
//-----------------------------------------------------------------------------------------------------------*/
extern string esTF="TimeFrame";
input ENUM_TIMEFRAMES TF=15;// Zum Testen M15
//-----------------------------------------------------------------------------------------------------------*/
extern int Slippage=12345;
//-----------------------------------------------------------------------------------------------------------*/
extern int SL=275;// ?
//-----------------------------------------------------------------------------------------------------------*/
extern int TP=75;// ?
//-----------------------------------------------------------------------------------------------------------*/
extern string esIITCBSMS1="if IsTradeContexBusy()";
extern string esIITCBSMS2="sleep MS";
extern int slMS=20;//
//-----------------------------------------------------------------------------------------------------------*/
extern string esDOONO1="Dist to OrderOpenPrice()";
extern string esDOONO2="open next Order";
extern int D_ONO=25;// Zum Testen ...
//-----------------------------------------------------------------------------------------------------------*/
extern string esDOCAO1="Dist to OrderOpenPrice()";
extern string esDOCAO2="close all Orders";
extern int D_CAO=50;// Zum Testen ... Weniger als ca. ?   ? ist wahrscheinlich nicht ausreichend?
//-----------------------------------------------------------------------------------------------------------*/
extern int OrdersNeed_Multi=3;// Zum Testen 3. 1-4?
//-----------------------------------------------------------------------------------------------------------*/
extern double Lots=0.01;
//=============================================================================================================
// G L O B A L E   D E K L A R A T I O N E N
//=============================================================================================================
bool
fiSH,fiLO,
neSH,neLO,
OC
;
//-----------------------------------------------------------------------------------------------------------*/
double
SL_Sel,SL_Buy,TP_Sel,TP_Buy,MSL,
FiSel_DONO,FiBuy_DONO,
NeSel_DONO,NeBuy_DONO,
FiSel_DCAO,FiBuy_DCAO
;
//-----------------------------------------------------------------------------------------------------------*/
int
TI_FiSel,TI_FiBuy,TI_NeSel,TI_NeBuy,
MN_NeSel,MN_NeBuy,
i,j,k,l,m,n,o,p,q,r,s,t,u,
Opened_Sel,Opened_Buy,
Need_Sel,Need_Buy
;
//=============================================================================================================
// I N I T / D E I N I T
//=============================================================================================================
void OnInit(){
  ChartSetSymbolPeriod(0,NULL,TF);}
// void OnDeinit(const int reason){}// DeInit überflüssig?
//=============================================================================================================
// E A   F U N K T I O N E N   S T A R T
//=============================================================================================================
void OnTick(){
//=============================================================================================================
// D I G I T S
//=============================================================================================================
if(Digits==3||Digits==5){
  D_ONO=10*D_ONO;
  D_CAO=10*D_CAO;}
//=============================================================================================================
// S T O P   L O S S
//=============================================================================================================
//SL auf 0 stellen, wenn oben <1,
//um irgendwelche Missverständnisse zu vermeiden.
if(SL<1){
  SL_Sel=0.0;
  SL_Buy=0.0;}
if(SL>=1){
  SL_Sel=NormalizeDouble(Bid+SL*_Point,_Digits);
  SL_Buy=NormalizeDouble(Ask-SL*_Point,_Digits);}
//SL genauso groß wie Minstoplevels machen, wenn er kleiner ist:
MSL=MarketInfo(Symbol(),MODE_STOPLEVEL);
if(SL_Sel<MSL)SL_Sel=MSL;
if(SL_Buy<MSL)SL_Buy=MSL;
//=============================================================================================================
// T A K E   P R O F I T
//=============================================================================================================
//TP auf 0 stellen, wenn oben <1,
//um irgendwelche Missverständnisse zu vermeiden.
if(TP<1){
  TP_Sel=0.0;
  TP_Buy=0.0;}
if(TP>=1){
  TP_Sel=NormalizeDouble(Bid-TP*_Point,_Digits);
  TP_Buy=NormalizeDouble(Ask+TP*_Point,_Digits);}
//=============================================================================================================
// O R D E R   S E A R C H   1
//=============================================================================================================
fiSH=false;
neSH=false;
fiLO=false;
neLO=false;
for(i=OrdersTotal()-1;i>=0;i--){
if(OrderSelect(i,SELECT_BY_POS)){
if(OrderSymbol()==Symbol()){
if(OrderMagicNumber()==MN_FiSel)fiSH=true;
if(OrderMagicNumber()==MN_NeSel)neSH=true;
if(OrderMagicNumber()==MN_FiBuy)fiLO=true;
if(OrderMagicNumber()==MN_NeBuy)neLO=true;}}}
//=============================================================================================================
// O P E N   F I R S T   S E L L / O P E N   F I R S T   B U Y
//=============================================================================================================
// Wenn gar keine Orders offen sind...
if(fiSH==false&&fiLO==false&&neSH==false&&neLO==false){
//MNs auf default setzen:
  MN_NeSel=MN_NeSel_def;
  MN_NeBuy=MN_NeBuy_def;
//Alle Zähler auf 0 setzen:
  Opened_Sel=0;
  Opened_Buy=0;
  Need_Sel  =0;
  Need_Buy  =0;
//Wenn zur Zeit Orders geöffnet werden dürfen FirstSel und FirstBuy öffnen.
  if(Hour()>=FromH&&Hour()<=TillH){
    if(IsTradeAllowed()==true)TI_FiSel=OrderSend(Symbol(),OP_SELL,Lots,NULL,Slippage,SL_Sel,TP_Sel,NULL,MN_FiSel,Blue);
    if(IsTradeContextBusy()==true)Sleep(slMS);
    if(IsTradeAllowed()==true)TI_FiBuy=OrderSend(Symbol(),OP_BUY,Lots,NULL,Slippage,SL_Buy,TP_Buy,NULL,MN_FiBuy,Blue);
    if(IsTradeContextBusy()==true)Sleep(slMS);}}
//=============================================================================================================
// O R D E R   S E A R C H   2
//=============================================================================================================
fiSH=false;
neSH=false;
fiLO=false;
neLO=false;
for(j=OrdersTotal()-1;j>=0;j--){
if(OrderSelect(j,SELECT_BY_POS)){
if(OrderSymbol()==Symbol()){
if(OrderMagicNumber()==MN_FiSel)fiSH=true;
if(OrderMagicNumber()==MN_NeSel)neSH=true;
if(OrderMagicNumber()==MN_FiBuy)fiLO=true;
if(OrderMagicNumber()==MN_NeBuy)neLO=true;}}}
//-----------------------------------------------------------------------------------------------------------*/
// Wenn nur FirstSel und FirstBuy offen sind...
if(fiSH==true&&fiLO==true&&neSH==false&&neLO==false){
//...FirstSel / FirstBuy raus suchen:
  for(k=OrdersTotal()-1;k>=0;k--){
  if(OrderSelect(k,SELECT_BY_POS)){
  if(OrderSymbol()==Symbol()){
//=============================================================================================================
//  O P E N   F I R S T   N E X T   S E L L
//=============================================================================================================
//  FirstSel auswählen:
    if(OrderMagicNumber()==MN_FiSel){
//    Prüfen, ob FirstSel unter D_ONO ist:
      FiSel_DONO=NormalizeDouble(OrderOpenPrice()-D_ONO*_Point,_Digits);
//    Wenn FirstSel unter D_ONO ist...      
      if(Bid<=FiSel_DONO){

//      MN_NeSel(==MN_NeSel_def) um 1 verringern:
        MN_NeSel--;

//      ...erste NextSels öffnen:
        for(k=OrdersNeed_Multi;k>=1;k--){
          if(IsTradeAllowed()==true)TI_NeSel=OrderSend(Symbol(),OP_SELL,Lots,NULL,Slippage,SL_Sel,TP_Sel,NULL,MN_NeSel,Blue);
          if(IsTradeContextBusy()==true)Sleep(slMS);
          Opened_Sel++;
          Need_Sel=OrdersNeed_Multi*Opened_Sel;
          Need_Buy=OrdersNeed_Multi*Need_Sel;
    } } }// FirstSel mit MN_FiSel ausgewählt.
//=============================================================================================================
//  O P E N   F I R S T   N E X T   B U Y
//=============================================================================================================
//  FirstBuy auswählen:
    if(OrderMagicNumber()==MN_FiBuy){
//    Prüfen, ob FirstBuy über D_ONO ist:
      FiBuy_DONO=NormalizeDouble(OrderOpenPrice()+D_ONO*_Point,_Digits);
//    Wenn FirstBuy über D_ONO ist...
      if(Ask>=FiBuy_DONO){

//      MN_NeBuy (==MN_NeBuy_def) um 1 erhöhen:
        MN_NeBuy++;

//      ...erste NextBuys öffnen:
        for(l=OrdersNeed_Multi;l>=1;l--){
          if(IsTradeAllowed()==true)TI_NeBuy=OrderSend(Symbol(),OP_BUY,Lots,NULL,Slippage,SL_Buy,TP_Buy,NULL,MN_NeBuy,Blue);
          if(IsTradeContextBusy()==true)Sleep(slMS);
          Opened_Buy++;
          Need_Buy=OrdersNeed_Multi*Opened_Buy;
          Need_Sel=OrdersNeed_Multi*Need_Buy;
    } } }// FirstBuy mit MN_FiBuy ausgewählt.
//-----------------------------------------------------------------------------------------------------------*/
} } } }// nach Order Search 2
//=============================================================================================================
// O R D E R   S E A R C H   3
//=============================================================================================================
fiSH=false;
neSH=false;
fiLO=false;
neLO=false;
for(m=OrdersTotal()-1;m>=0;m--){
if(OrderSelect(m,SELECT_BY_POS)){
if(OrderSymbol()==Symbol()){
if(OrderMagicNumber()==MN_FiSel)fiSH=true;
if(OrderMagicNumber()==MN_NeSel)neSH=true;
if(OrderMagicNumber()==MN_FiBuy)fiLO=true;
if(OrderMagicNumber()==MN_NeBuy)neLO=true;}}}
//Wenn FirstSel und FirstBuy offen sind...
if(fiSH==true&&fiLO==true){
//=============================================================================================================
//  C H E C K   L A S T   N E X T   S E L L
//=============================================================================================================
//...und wenn NextSel offen ist...
  if(neSH==true){

//  ...letzten NextSel raus suchen:
    for(n=OrdersTotal()-1;n>=0;n--){
    if(OrderSelect(n,SELECT_BY_POS)){
    if(OrderSymbol()==Symbol()){

      if(OrderMagicNumber()==MN_NeSel){

//      Wenn letzter NextSel unter D_ONO ist...
        NeSel_DONO=NormalizeDouble(OrderOpenPrice()-D_ONO*_Point,_Digits);
        if(Bid<=NeSel_DONO){
        
        MN_NeSel=OrderMagicNumber();

//        ...FirstSel raus suchen:
          for(o=OrdersTotal()-1;o>=0;o--){
          if(OrderSelect(o,SELECT_BY_POS)){
          if(OrderSymbol()==Symbol()){

            if(OrderMagicNumber()==MN_FiSel){

//            ...prüfen, ob FirstSel Gewinn-Dist erreicht hat:
              FiSel_DCAO=NormalizeDouble(OrderOpenPrice()-D_CAO*_Point,_Digits);
//=============================================================================================================
//            O P E N   M O R E   N E X T   S E L L
//=============================================================================================================
//            Wenn FirstSel Gewinn-Dist nicht erreicht hat...
              if(Ask>FiSel_DCAO){

//              MN_NeSel wieder um 1 verringern...
                MN_NeSel--;

//              ...und weitere SelOrders öffnen.
                for(p=Need_Sel;p>=1;p--){
                  if(IsTradeAllowed()==true)TI_NeSel=OrderSend(Symbol(),OP_SELL,Lots,NULL,Slippage,SL_Sel,TP_Sel,NULL,MN_NeSel,Blue);
                  if(IsTradeContextBusy()==true)Sleep(slMS);
                  Opened_Sel++;
                  Need_Sel=OrdersNeed_Multi*Opened_Sel;
                  Need_Buy=OrdersNeed_Multi*Need_Sel;}}
//=============================================================================================================
//            C L O S E   A L L   B Y   S E L
//=============================================================================================================//
//            Wenn FirstSell Gewinn-Dist doch erreicht hat...
              if(Ask<=FiSel_DCAO){
//              ...alle Orders schließen.
                for(q=OrdersTotal()-1;q>=0;q--){
                if(OrderSelect(q,SELECT_BY_POS)){
                if(OrderSymbol()==Symbol()){
                if(IsTradeAllowed()==true)OC=OrderClose(OrderTicket(),OrderLots(),NULL,Slippage,Red);
                if(IsTradeContextBusy()==true)Sleep(slMS);}}}}
//-----------------------------------------------------------------------------------------------------------*/
} } } } } } } } } }// neSh==true
//=============================================================================================================
//  C H E C K   L A S T   N E X T   B U Y
//=============================================================================================================
// wenn NextBuy offen ist...
  if(neLO==true){

//  ...letzten NextBuy auswählen:
    for(r=OrdersTotal()-1;r>=0;r--){
    if(OrderSelect(r,SELECT_BY_POS)){
    if(OrderSymbol()==Symbol()){

    if(OrderMagicNumber()==MN_NeBuy){

//    Wenn letzter NextBuy über D_ONO ist...      
      NeBuy_DONO=NormalizeDouble(OrderOpenPrice()+D_ONO*_Point,_Digits);
      if(Ask>=NeBuy_DONO){
      
        MN_NeBuy=OrderMagicNumber();

//      Prüfen, ob FirstBuy Gewinn-Dist erreicht hat:
        for(s=OrdersTotal()-1;s>=0;s--){
        if(OrderSelect(s,SELECT_BY_POS)){
        if(OrderSymbol()==Symbol()){
        
        if(OrderMagicNumber()==MN_FiBuy){

          FiBuy_DCAO=NormalizeDouble(OrderOpenPrice()+D_CAO*_Point,_Digits);
//=============================================================================================================
//        O P E N   M O R E   N E X T   B U Y
//=============================================================================================================         
//        Wenn FirstBuy Gewinn-Dist nicht erreicht hat...
          if(Bid<FiBuy_DCAO){

//          MN_NeBuy um 1 erhöhen...
            MN_NeBuy++;
            
//          ...und weitere Buy-Orders öffnen:
            for(t=Need_Buy;t>=1;t--){
              if(IsTradeAllowed()==true)TI_NeBuy=OrderSend(Symbol(),OP_BUY,Lots,NULL,Slippage,SL_Buy,TP_Buy,NULL,MN_NeBuy,Blue);
              if(IsTradeContextBusy()==true)Sleep(slMS);
              Opened_Buy++;
              Need_Buy=OrdersNeed_Multi*Opened_Buy;
              Need_Sel=OrdersNeed_Multi*Need_Buy;}}
//=============================================================================================================
//        C L O S E   A L L   B Y   B U Y
//=============================================================================================================
//        Wenn FirstBuy Gewinn-Dist doch erreicht hat...
          if(Bid>=FiBuy_DCAO){
//          ...alle Orders schließen.
            for(u=OrdersTotal()-1;u>=0;u--){
            if(OrderSelect(u,SELECT_BY_POS)){
            if(OrderSymbol()==Symbol()){
            if(IsTradeAllowed()==true)OC=OrderClose(OrderTicket(),OrderLots(),NULL,Slippage,Red);
            if(IsTradeContextBusy()==true)Sleep(slMS);}}}}
//-----------------------------------------------------------------------------------------------------------*/
} } } } } } } } } }// Letzter NextBuy ausgewählt.
//-----------------------------------------------------------------------------------------------------------*/
}// nach OS3. ( fiSH==true && fiLO==true )
//=============================================================================================================
// E A   F U N K T I O N E N   B E E N D E N
//=============================================================================================================
}// void OnTick()

Anhang anzeigen LoShD_MNpm.mq4

 
Zuletzt bearbeitet von einem Moderator: