Zum Inhalt springen
View in the app

A better way to browse. Learn more.

#T/N/X/T

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Hilfe bei Programmierung

Geschrieben

MQL Anfänger hat eine Bitte an euch,ich habe versucht ein für euch leichten E/A zu schreiben.

Der E/A besteht aus drei MA.

Die 1 Funktion Long

sollte wenn der kurzfristiger gl.D.(ma1)über dem mittelfristigen(ma2),und der mittefristige über dem langfristigen (ma3)ist,Long gehen also Buy. und den Trade schließen wenn (ma1) unter (ma2) fällt.

 

Die 2 Funktion Short

wenn der kurzfristiger (ma1)unter dem mittelfristigen(ma2),und der mittelfristige

unter dem langfristigen(ma3) ist, Short gehen also Sell.

und den Trade schließen wenn (ma1)über den (ma2) steigt.

 

So die Beschreibung,

der Editor meldet keine Fehler,aber das hat ja für die Funktionen keine

Bedeutung.

Im Long bereicht kauft er und verkauft auch.das wars aber schon,

Ich muß in der Logik,oder im Programmcode fehler haben,

kann einer von euch mir weiterhelfen.das der E/A Funktioniert.?

Bis bald

karlos10

 

-------------------------------------------------------------------------------------

extern int Profit= 80;
extern int Stopp = 25;
extern int MagicNumber = 700;
extern int ima1 = 5;
extern int ima2 = 35;
extern double lot = 0.1;
extern int Slippage = 2;


int CalcCurOrd(string symbol)
 {
  int buys=0,sells=0;

  for(int i=0;i<OrdersTotal();i++)
    {
     if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
     if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
       {
        if(OrderType()==OP_BUY) buys++;
        if(OrderType()==OP_SELL) sells++;
       }
    }

  if(buys>0) return(buys);
  else       return(-sells);
 }


bool Funktion_1_Long()    
 {
  double ma1 = iMA(NULL,0,5,0,MODE_SMA,PRICE_CLOSE,0);
  double ma2 = iMA(NULL,0,40,0,MODE_SMA,PRICE_CLOSE,0);
  double ma3 = iMA(NULL,0,200,0,MODE_SMA,PRICE_CLOSE,0);
  
  if (ma1>ma2 && ma2 > ma3)   // kurzfristiger gl.D. liegt über dem mittelfristigen
                            // und der mittefristige über dem langfristigen
  
  return(true); else return(false);
  }
 
   
bool Funktion_2_Short()    
 {
  double ma1 = iMA(NULL,0,5,0,MODE_SMA,PRICE_CLOSE,0);
  double ma2 = iMA(NULL,0,40,0,MODE_SMA,PRICE_CLOSE,0);
  double ma3 = iMA(NULL,0,200,0,MODE_SMA,PRICE_CLOSE,0);
  
  if (ma1<ma2 && ma2<ma3)   // kurzfristiger gl.D. liegt unter dem mittelfristigen
                            // und der mittefristige unter dem langfristigen
  
  return(true); else return(false);
   
 
 }

//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void CheckForOpen() 
 {
  int res;
  
     if(Funktion_1_Long())
    
        {
         res=OrderSend(Symbol(),OP_BUY,lot,Ask,Slippage,
                       0,0,"long",MagicNumber,0,White);
        }
 //----OrderSend(Symbol(),OP_BUY,lot,Ask,Slippage,
 //                   0,0,"long",MagicNumber,0,White);
 //                   prevtime = Time[0]; return;

    if(Funktion_2_Short())
    
     
        {
         res=OrderSend(Symbol(),OP_SELL,lot,Bid,Slippage,
                       0,0,"short",MagicNumber,0,Red);
        }
       
  }
  
// Check for close order conditions

void CheckForClose()
 {    
  for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)     break;
      if(OrderMagicNumber()!=MagicNumber || OrderSymbol()!=Symbol()) continue;     
      
      // Check order type
            
      if(OrderType()==OP_BUY)
        {      
         if (Bid>(OrderOpenPrice()+Profit*Point)) 
           {
            OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Green);
            return(0);
           }
        }
        
         
      if(OrderType()==OP_SELL)
        {    
         if (Ask<(OrderOpenPrice()-Profit*Point))
           {
            OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Red);
            return(0);
           }
        }
                
     }
  return(0);
 }
    
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
void start()
 {
   
  if(CalcCurOrd(Symbol())==0) CheckForOpen();
  if(CalcCurOrd(Symbol())!=0) CheckForClose();

 }
//+------------------------------------------------------------------+

karlosMA.mq4

Bearbeitet von whipsaw
mql tag hinzugefügt

  • Antworten 98
  • Aufrufe 10,8Tsd
  • Erstellt
  • Letzte Antwort

Top-Benutzer in diesem Thema

Most Popular Posts

  • Das Selbe macht Ehlers auch mit US Treasury Bond Futures. Die Zeitachse wird in Sektoren von z.B. 10 Bars eingeteilt und es wird für jeden Bar geschaut, wo - bezogen auf das Hoch und das Tief innerha

Veröffentlichte Bilder

Featured Replies

Geschrieben

Hi,

 

kleiner allgemeiner Hinweis: es gibt hier CodeTags, mit denen du Sourcecode im Post besser darstellen kannst.

einfach "["mql"]" vor und "["/mql"]" nach dem Code (ohne die Anführungsstriche).

 

Zu deinem Problem:

Ich seh jetzt im Code keinen direkten Grund warum die Shortpositionen nicht geöffnet werden sollten. Könntest du nochmal genau beschreiben wo das Problem liegt?

 

Eine Sache ist mir aufgefallen: Beim schließen von Positionen solltest du die Liste der Orders von hinten nach vorne durchgehen, da die Einträge automatisch nachrücken wenn du einen löscht. Sprich wenn du den 2. löscht wird der vorige 3. zum 2., nach dem löschen schaust du dir dann den aktuellen 3. an (weil den 2. hast du ja gelöscht) und übersiehst somit den "neuen" 2.

Du schließt außerdem pro Tick max. 1 Order, ist das gewollt?

 

Nochwas: du hast geschrieben das der Trade geschlossen werden soll, wenn ma1

Geschrieben

Hallo karlos,

das Problem im Code ist, dass du immer Long bist.

Sobald Long Trade durch den TP geschlossen ist ( und nicht wie du bschrieben hast durch Kreuezen ma1 und MA2) - öffnet er sofort wieder einen Long-Trade,

da Bedienung wieder "wahr" ist, weil um TP auszulösen muss der Kurs selbstverständlich steigen und da zeigen alle MA´s nach oben, was auch den Eintritt in Long wieder auslöst

Die Bedienung für Long ist somit immer da und dadurch, dass kein SL und TP bei Ordersend realisiert ist,

wird die Position so lange gehalten, bis virtueler TP mitgenommen wird.

Dadurch wird zwar erreicht, dass alle geschlossenen Trades profitabel sind, verursacht aber einen grösseren Drawdown bis die Position geschlossen ist.

Der Drawdown ist somit nicht kontrollierbar und kann natürlich auch den MarginCall hervorrufen.

 

Lösung: für Positionseröffnung ist eine Verriegelung einzubauen - dass nur ein kurzer Signaltrigger entsteht und nicht ein Dauerkaufsignal, wenn alle Linien übereinander liegen.

Dafür brauchst du das Signal mit vorherigem Bar zu verknüpfen um nur bei einer MA-Kreuzung zu handeln

so z.B

bool Funktion_1_Long()
{
double ma1   = iMA(NULL,0,5,0,MODE_SMA,PRICE_CLOSE,0);
double ma2   = iMA(NULL,0,40,0,MODE_SMA,PRICE_CLOSE,0);
double ma1_1 = iMA(NULL,0,5,0,MODE_SMA,PRICE_CLOSE,1);
double ma2_1 = iMA(NULL,0,40,0,MODE_SMA,PRICE_CLOSE,1);
double ma3   = iMA(NULL,0,200,0,MODE_SMA,PRICE_CLOSE,0);

if (ma1>ma2 && ma2 > ma3 && ma1_1<ma_2_1) // kurzfristiger gl.D. liegt u"ber dem mittelfristigen
// und der mittefristige u"ber dem langfristigen

return(true); else return(false);
}

 

Signal zur Positionsschliessung muss natürlich auch korrigiert werden

Geschrieben
  • Autor
erstmal Bedanke ich mich,ich melde mich bald wieder

Bearbeitet von ronner
Zitat komplett entfernt - bitte auf notwendige Länge achten.

Geschrieben
  • Autor
erstmal Bedanke ich mich,ich melde mich bald wieder

 

Hallo

@ Mythos und

@ titanfx

 

 

jetzt

Long und Schort funktioniert jetzt,aber ich weiß nicht wie ich die geoffnete Position schließen kann (code).

ich habe einiges ausprobiert,das sieht mann im deaktivierten code,aber ich finde nicht den richtigen Weg.

und wie ich TakeProfit in OrderSend einbaue.

 

 

----------------------------

mql
//KarlosMA Versuch mit 3 gleitender Durchschnitte
//Long
//Das Prog soll wenn der kurzfristiger gl.D.(ma1)über dem mittelfristigen(ma2),und der
//mittefristige über dem langfristigen (ma3)ist,Long gehen also Buy. 
//und den Trade schließen wenn (ma1) unter (ma2) fällt. 
//------------------------------------------------------------------------------------
//Short
//wenn der kurzfristiger (ma1)unter dem mittelfristigen(ma2),und der mittelfristige
//unter dem langfristigen(ma3) ist, Short gehen also Sell.
//und den Trade schließen wenn (ma1)über den (ma2) steigt. 


extern int Profit= 50;
extern int Stopp = 25;
extern int MagicNumber = 700;
extern int ima1 = 8;
extern int ima2 = 13;
extern double lot = 0.1;
extern int Slippage = 3;


int CalcCurOrd(string symbol)
 {
  int buys=0,sells=0;

  for(int i=0;i<OrdersTotal();i++)
    {
     if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
     if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
       {
        if(OrderType()==OP_BUY) buys++;
        if(OrderType()==OP_SELL) sells++;
       }
    }

  if(buys>0) return(buys);
  else       return(-sells);
 }
//----------


bool Funktion_1_Long()    
{
double ma1 = iMA(NULL,0,8,0,MODE_SMA,PRICE_CLOSE,0);
double ma2 = iMA(NULL,0,13,0,MODE_SMA,PRICE_CLOSE,0);
double ma1_1 = iMA(NULL,0,8,0,MODE_SMA,PRICE_CLOSE,1);
double ma2_1 = iMA(NULL,0,13,0,MODE_SMA,PRICE_CLOSE,1);
double ma3 = iMA(NULL,0,120,0,MODE_SMA,PRICE_CLOSE,0);

if (ma1>ma2 && ma2 > ma3 && ma1_1<ma2_1) // kurzfristiger gl.D. liegt u"ber dem mittelfristigen
// und der mittefristige u"ber dem langfristigen

return(true); else return(false);
} 
/*bool Funktion_1_Close() 
{
double ma1 = iMA(NULL,0,8,0,MODE_SMA,PRICE_CLOSE,0);
double ma2 = iMA(NULL,0,13,0,MODE_SMA,PRICE_CLOSE,0);
double ma1_1 = iMA(NULL,0,8,0,MODE_SMA,PRICE_CLOSE,1);
double ma2_1 = iMA(NULL,0,13,0,MODE_SMA,PRICE_CLOSE,1);
double ma3 = iMA(NULL,0,120,0,MODE_SMA,PRICE_CLOSE,0);

if (ma1<ma2 && ma2 < ma3 && ma1_1<ma2_1)

return(true); else return(false);
}   
*/
bool Funktion_1_Short()    
{
double ma1 = iMA(NULL,0,8,0,MODE_SMA,PRICE_CLOSE,0);
double ma2 = iMA(NULL,0,13,0,MODE_SMA,PRICE_CLOSE,0);
double ma1_1 = iMA(NULL,0,8,0,MODE_SMA,PRICE_CLOSE,1);
double ma2_1 = iMA(NULL,0,13,0,MODE_SMA,PRICE_CLOSE,1);
double ma3 = iMA(NULL,0,120,0,MODE_SMA,PRICE_CLOSE,0); 
  
if (ma1<ma2 && ma2<ma3 && ma1_1<ma2_1)  
// kurzfristiger gl.D. liegt unter dem mittelfristigen
                            // und der mittefristige unter dem langfristigen
  
  return(true); else return(false);
 
 }

/*bool Funktion_2_Close()
{
double ma1 = iMA(NULL,0,8,0,MODE_SMA,PRICE_CLOSE,0);
double ma2 = iMA(NULL,0,13,0,MODE_SMA,PRICE_CLOSE,0);
double ma1_1=iMA(NULL,0,8,0,MODE_SMA,PRICE_CLOSE,1);
double ma2_1=iMA(NULL,0,13,0,MODE_SMA,PRICE_CLOSE,1);
double ma3 = iMA(NULL,0,120,0,MODE_SMA,PRICE_CLOSE,0); 
  
if (ma1>ma2 && ma2>ma3 && ma1_1>ma2_1)  

return(true); else return(false);
 
 }
*/
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void CheckForOpen() 
 {
     int res;
  
     if(Funktion_1_Long())
         
         
         {
         res=OrderSend(Symbol(),OP_BUY,lot,Ask,Slippage,
                       0,0,"long",MagicNumber,0,White);
         } 
                 
                 
    if(Funktion_1_Short())
    
     
        {
         res=OrderSend(Symbol(),OP_SELL,lot,Bid,Slippage,
                       0,0,"short",MagicNumber,0,Red);
        }
       
  }
  
// Check for close order conditions

void CheckForClose()
  {    
  
  
  
  for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)     break;
      if(OrderMagicNumber()!=MagicNumber || OrderSymbol()!=Symbol()) continue;     
      
      // Check order type
//if(Open[1]<ma1 && Close[1]>ma1)
// if (ma1<ma2 && ma2 < ma3 && ma1_1<ma2_1)
          
      if(OrderType()==OP_BUY)
        {      
         if (Bid>(OrderOpenPrice()+Profit*Point)) 
           {
     //       if (ma1<ma2 && ma2 < ma3 && ma1_1<ma2_1)
            
            OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Green);
            return(0);
           }
        }
 //if(Open[1]<ma1 && Close[1]<ma1) 
 //if (ma1>ma2 && ma2>ma3 && ma1_1>ma2_1)   
         
      if(OrderType()==OP_SELL)
        {    
         if (Ask<(OrderOpenPrice()-Profit*Point))
           {
    //       if (ma1>ma2 && ma2>ma3 && ma1_1>ma2_1) 
            
            OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Red);
            return(0);
           }
        }
                
     }
  return(0);
 }
    
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
void start()
 {
   
  if(CalcCurOrd(Symbol())==0) CheckForOpen();
  if(CalcCurOrd(Symbol())!=0) CheckForClose();

 }
/mql

Bearbeitet von ronner
mql Tags hinzugefügt

Geschrieben

@karlos10,

 

bitte nutze wie Mythos schon mal vorschlug, die Codefunktion.

 

Einfach

[mql]

an den Anfang und

[/mql]

ans Ende.

 

Wenn jedesmal der Code komplett ausgeschrieben ist, wird der Thread kilometerlang und unübersichtlich.

Geschrieben
aber ich weiß nicht wie ich die geoffnete Position schließen kann

 

Du könntest zB deine alte Close Funktion so umbauen:

 

 void CheckForClose()
 {    
   double ma1 = iMA(NULL,0,8,0,MODE_SMA,PRICE_CLOSE,0);
   double ma2 = iMA(NULL,0,13,0,MODE_SMA,PRICE_CLOSE,0);
  for(int i=OrdersTotal()-1;i>= 0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)     break;
      if(OrderMagicNumber()!=MagicNumber || OrderSymbol()!=Symbol()) continue;     
      
      // Check order type
            
      if(OrderType()==OP_BUY)
        {      
         if(ma1 < ma2) 
            OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Green);
         else if (Bid>(OrderOpenPrice()+Profit*Point)) 
           {
            OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Green);
           }
        }
        
         
      if(OrderType()==OP_SELL)
        {    
        if(ma1 > ma2) 
            OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Red);
         else  if (Ask<(OrderOpenPrice()-Profit*Point))
           {
            OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Red);
           }
        }
                
     }
  return(0);
 }

 

Hier wäre die MA-Kreuzungsbedingung und der manuelle TakeProfit kombiniert.

 

Wenn du den TP in die OrderSend schreiben willst, musst du nur den entsprechenden Wert mitübergeben.

Die OrderSend Syntax an sich ist folgende (siehe auch MQL Reference direkt im MetaEditor):

int OrderSend( string symbol, int cmd, double volume, double price, int slippage, double stoploss, double takeprofit, string comment=NULL, int magic=0, datetime expiration=0, color arrow_color=CLR_NONE)

In deinem Fall also zB für Long:

OrderSend(Symbol(),OP_BUY,lot,Ask,Slippage,
					0,Ask + Profit*Point,"long",MagicNumber,0,White);

 

HTH

Geschrieben
  • Autor
Wenn jedesmal der Code komplett ausgeschrieben ist, wird der Thread kilometerlang und unübersichtlich.

 

@ronner

Hallo hab ich die Eckigenklammern vergessen?

war das der Fehler ?

Bearbeitet von ronner
Zitat gekürzt

Geschrieben
  • Autor
ja

 

Hallo

jetzt scheint es zu funktionieren,aber noch nicht richtig es kommen nur negative ergebnisse raus,könnt Ihr mal drüber sehen?

 

 

//KarlosMA Versuch mit 3 gleitender Durchschnitte
//Long
//Das Prog soll wenn der kurzfristiger gl.D.(ma1)über dem mittelfristigen(ma2),und der
//mittefristige über dem langfristigen (ma3)ist,Long gehen also Buy. 
//und den Trade schließen wenn (ma1) unter (ma2) fällt. 
//------------------------------------------------------------------------------------
//Short
//wenn der kurzfristiger (ma1)unter dem mittelfristigen(ma2),und der mittelfristige
//unter dem langfristigen(ma3) ist, Short gehen also Sell.
//und den Trade schließen wenn (ma1)über den (ma2) steigt. 


extern int Profit= 60;
extern int Stopp =10;
extern int MagicNumber = 700;
extern int ima1 = 5;
extern int ima2 = 34;
extern double lot = 0.1;
extern int Slippage = 2;


int CalcCurOrd(string symbol)
 {
  int buys=0,sells=0;

  for(int i=0;i<OrdersTotal();i++)
    {
     if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
     if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
       {
        if(OrderType()==OP_BUY) buys++;
        if(OrderType()==OP_SELL) sells++;
       }
    }

  if(buys>0) return(buys);
  else       return(-sells);
 }
//----------


bool Funktion_1_Long()    
{
double ma1 = iMA(NULL,0,5,0,MODE_SMA,PRICE_CLOSE,0);
double ma2 = iMA(NULL,0,34,0,MODE_SMA,PRICE_CLOSE,0);
double ma1_1 = iMA(NULL,0,5,0,MODE_SMA,PRICE_CLOSE,1);
double ma2_1 = iMA(NULL,0,34,0,MODE_SMA,PRICE_CLOSE,1);
double ma3 = iMA(NULL,0,144,0,MODE_SMA,PRICE_CLOSE,0);

if (ma1>ma2 && ma2 > ma3 && ma1_1>ma2_1) // kurzfristiger gl.D. liegt u"ber dem mittelfristigen
// und der mittefristige u"ber dem langfristigen

return(true); else return(false);
} 

bool Funktion_1_Short()    
{
double ma1 = iMA(NULL,0,5,0,MODE_SMA,PRICE_CLOSE,0);
double ma2 = iMA(NULL,0,34,0,MODE_SMA,PRICE_CLOSE,0);
double ma1_1 = iMA(NULL,0,5,0,MODE_SMA,PRICE_CLOSE,1);
double ma2_1 = iMA(NULL,0,34,0,MODE_SMA,PRICE_CLOSE,1);
double ma3 = iMA(NULL,0,144,0,MODE_SMA,PRICE_CLOSE,0); 
  
if (ma1<ma2 && ma2<ma3 && ma1_1<ma2_1)  
// kurzfristiger gl.D. liegt unter dem mittelfristigen
                            // und der mittefristige unter dem langfristigen
  
  return(true); else return(false);
 
 }


//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void CheckForOpen() 
 {
     double ma1; 
     double ma2; 
     int res;
     
      
    
    
    if(Funktion_1_Long())
     
        
         
         {
                   
        res=OrderSend(Symbol(),OP_BUY,lot,Ask,Slippage,
            Bid-Point*Stopp,Ask + Profit*Point,"long",MagicNumber,0,White);
                  
         } 
                 
                 
    if(Funktion_1_Short())
    
   
     
        {
         res=OrderSend(Symbol(),OP_SELL,lot,Bid,Slippage,
            Ask+Point*Stopp,Bid-Profit*Point,"short",MagicNumber,0,Red);
        }
       
  }
  
// Check for close order conditions

void CheckForClose()
{ 
double ma1 = iMA(NULL,0,5,0,MODE_SMA,PRICE_CLOSE,0);
double ma2 = iMA(NULL,0,34,0,MODE_SMA,PRICE_CLOSE,0);
double ma1_1 = iMA(NULL,0,5,0,MODE_SMA,PRICE_CLOSE,1);
double ma2_1 = iMA(NULL,0,34,0,MODE_SMA,PRICE_CLOSE,1);
double ma3 = iMA(NULL,0,144,0,MODE_SMA,PRICE_CLOSE,0);

for(int i=OrdersTotal()-1;i>= 0;i--)

{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderMagicNumber()!=MagicNumber || OrderSymbol()!=Symbol()) continue;

// Check order type

if(OrderType()==OP_BUY)
{
if(ma1<ma2 && ma2 > ma3 && ma1_1< ma2_1)
OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Green);
else if (Bid>(OrderOpenPrice()+Profit*Point))
{
OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Green);
}
}

if(OrderType()==OP_SELL)
{
if(ma1>ma2 && ma2<ma3 && ma1_1>ma2_1)
OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Red);
else if (Ask<(OrderOpenPrice()-Profit*Point))
{
OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Red);
}
}

}
return(0);
}

     
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
void start()
 {
   
  if(CalcCurOrd(Symbol())==0) CheckForOpen();
  if(CalcCurOrd(Symbol())!=0) CheckForClose();

 }
//+------------------------------------------------------------------+

karlosMA.mq4

Geschrieben
aber noch nicht richtig es kommen nur negative ergebnisse raus

 

LOL zählen negative Performancezahlen jetzt zu Programmierfehlern? ;)

 

Tut der EA was er soll?

wenn nein: spezifizier bitte genauer wo das Problem liegt, jedesmal einen ganzen EA durchzuschauen ob da vielleicht irgendwo was nicht passen könnte ist auf die Dauer leider viel zu aufwändig.

Geschrieben
  • Autor
LOL zählen negative Performancezahlen jetzt zu Programmierfehlern? ;)

 

Tut der EA was er soll?

wenn nein: spezifizier bitte genauer wo das Problem liegt, jedesmal einen ganzen EA durchzuschauen ob da vielleicht irgendwo was nicht passen könnte ist auf die Dauer leider viel zu aufwändig.

Nein tut er nicht, es müßen noch Programmierfehler drin sein.

Weil es kommen sehr viele minustrade zustande,ich glaube das liegt daran das die

Order bei einer langen Kerze zufällig (in der Höhe) ausgelößt wird,siehe Bild.

und was mir noch aufgefallen ist,das nach dem kreuzen ,mehrere Order aufeinmal ausgeführt werden.??

 

was heist LOL ,Lachen?Auslachen?.

Ich wünsche euch ein schönes Wochenende

karlosMA.mq4

post-780-1258200548_thumb.jpg

Geschrieben
ich glaube das liegt daran das die

Order bei einer langen Kerze zufällig (in der Höhe) ausgelößt wird

nicht zufällig. Wenn du den GD auf den aktuellen Bar rechnest, nimmt er bei jedem Tick das aktuelle Close zur Berechnung dazu. Bei kurzen GDs wirkt sich das natürlich stark aus. Bei großen Kerzen wird er vermutlich am High eine Kreuzung haben, da das endgültige Close aber tiefer liegt, ist am Ende keine Signal mehr vorhanden.

 

Dadurch entstehen auch mehrfach entrys. da du nur abfragst ob am vorbar bereits die Differenz war, wird er innerhalb eines Bars bei jedem Tick wo das Signal existiert eine Order eröffnen.

 

Zur besseren Verständniss lässt du den EA einfach mal langsam im Strategietester laufen und ziehst auch die entsprechenden GDs auf den Chart, dann siehst du genau was passiert und warum.

Geschrieben
  • Autor
Hallo karlos,

das Problem im Code ist, dass du immer Long bist.

 

Danke

Hallo titanfx.muß ich im Shortbereich dann -1 einstellen.???

double ma1_1 = iMA(NULL,0,5,0,MODE_SMA,PRICE_CLOSE,-1);

double ma2_1 = iMA(NULL,0,40,0,MODE_SMA,PRICE_CLOSE,-1);

karlos10

Bearbeitet von ronner
Zitat gekürzt - bitte auf notwendige Länge achten.

Geschrieben
Danke

Hallo titanfx.muß ich im Shortbereich dann -1 einstellen.???

double ma1_1 = iMA(NULL,0,5,0,MODE_SMA,PRICE_CLOSE,-1);

double ma2_1 = iMA(NULL,0,40,0,MODE_SMA,PRICE_CLOSE,-1);

karlos10

Die letzte Zahl gibt an, wie viele Kerzen Du zurück zählst. Bei 0 betrachtet er die aktuelle Kerze, bei 1 wird der MA der vorigen Kerze betrachtet. -1 würde nun bedeuten, dass Du in die Zukunft blickst. Wenn Du short statt long machen willst, musst Du also in den Abfragen aus dem > ein

Geschrieben
  • Autor
nicht zufällig. Wenn du den GD auf den aktuellen Bar rechnest, nimmt er bei jedem Tick das aktuelle Close zur Berechnung dazu. Bei kurzen GDs wirkt sich das natürlich stark aus. Bei großen Kerzen wird er vermutlich am High eine Kreuzung haben, da das endgültige Close aber tiefer liegt, ist am Ende keine Signal mehr vorhanden.

 

Dadurch entstehen auch mehrfach entrys. da du nur abfragst ob am vorbar bereits die Differenz war, wird er innerhalb eines Bars bei jedem Tick wo das Signal existiert eine Order eröffnen.

 

Zur besseren Verständniss lässt du den EA einfach mal langsam im Strategietester laufen und ziehst auch die entsprechenden GDs auf den Chart, dann siehst du genau was passiert und warum.

 

@Mythos

@conglom-o

 

Das habe ich verstanden,aber es muß doch möglich sein unmittelbar nach der Kreuzung also beim steigen/fallen der Kerze zu ordern.ja ich weiß meine Fragen können Nerven,aber vom Code muß es doch möglich sein,oder.?

Geschrieben
Das habe ich verstanden,aber es muß doch möglich sein unmittelbar nach der Kreuzung also beim steigen/fallen der Kerze zu ordern.ja ich weiß meine Fragen können Nerven,aber vom Code muß es doch möglich sein,oder.?

 

das tust du derzeit ja, nur das die Kreuzung halt am Ende des Bars möglicherweise nicht mehr da ist.

 

Was willst du genau machen?

Kaufen wenn der GD, den du danach am Chart siehst, kreuzt?

Oder in dem Moment wo der sich ändernde GD kreuzt?

 

Möglich ist beides. Stell dir zuerst mal ein fixes Regelwerk zusammen was der EA wann tun soll, dann ist es viel einfacher zu programmieren.

Geschrieben
  • Autor
Was willst du genau machen?

 

Ich habe mich vielleicht falsch ausgedrückt.ja klar "Oder in dem Moment wo der sich ändernde GD kreuzt"

meine Ich.

Bearbeitet von ronner
Zitat eingekürzt

Geschrieben
  • Autor
dann tut der EA doch genau das was er soll oder?

 

nein tut er nicht,und das habe ich dir auch erklärt,oder?

Geschrieben

Nochmal langsam:

 

Was der EA gerade tut (nur für den Long Fall):

1. Bei jedem Tick werden die aktuellen GDs berechnet (die sich auch bei jedem Tick ändern), zusätzlich werden die GDs auf Basis des letzten bereits fertigen Bars (also Close[1]) berechnet (diese ändern sich nicht mehr).

2. Es wird verglichen: "Gilt für die aktuellen GDs schneller > mittlerer > langsamer" und "Gilt für die "alten" GDs schneller

 

 

Eine Kreuzung liegt vor, wenn für den vorigen Bar gilt "schneller mittlerer".

 

Es gäbe 2 Varianten: Betrachtet man die GDs immer nur am Ende eines Bars (also nur die endgültigen Werte die sich nicht mehr ändern) oder betrachtet man sie auch mittendrin.

 

Du hast geschrieben das du die "auch mittendrin" Variante betrachten willst und genau das tut der EA.

 

Also entweder du hast den Code inzwischen verändert, oder du willst das der EA was anderes tut als du hier geschrieben hast, weil die Einstiege vom EA tun gerade genau das was du hier an Anforderung geschrieben hast.

Geschrieben

Wenn man aktuell auf einen Chart schaut und sich die Kreuzungen begutachtet, hat man eine finale Variante der Kreuzungen vor Augen. Das Handelssystem durchläuft eine Unmenge dieser Varianten und agiert entsprechend mit Long/Short. Sofern eingebaut ist, dass bei bestehenden Orders keine neue Order hinzugefügt wird, bleibt es bei der ersten Kreuzung, die das System an dem jeweiligen Bar erkennt. Sofern das System nicht auf Close-Basis arbeitet wird dein System mit sehr hoher Wahrscheinlichkeit zu völlig irren Zeitpunkten in den Markt gehen, die im Nachhinein nicht nachvollziehbar sind, da man dann wohlgemerkt nur die eine finale Variante sehen kann.

 

Ich denke, in etwa ist dir das klar, ich kann dir auf jeden Fall raten die Sache unbedingt erst am wirklichen Close berechnen zu lassen, die Variante einen Trade während das 'Barwachstums' einzugehen ist alles andere als effektiv.

 

Viel Erfolg!

Geschrieben
  • Autor
Wenn man aktuell auf einen Chart schaut und sich die Kreuzungen begutachtet, hat man eine finale Variante der Kreuzungen vor Augen. Das Handelssystem durchläuft eine Unmenge dieser Varianten und agiert entsprechend mit Long/Short. Sofern eingebaut ist, dass bei bestehenden Orders keine neue Order hinzugefügt wird, bleibt es bei der ersten Kreuzung, die das System an dem jeweiligen Bar erkennt. Sofern das System nicht auf Close-Basis arbeitet wird dein System mit sehr hoher Wahrscheinlichkeit zu völlig irren Zeitpunkten in den Markt gehen, die im Nachhinein nicht nachvollziehbar sind, da man dann wohlgemerkt nur die eine finale Variante sehen kann.

 

Ich denke, in etwa ist dir das klar, ich kann dir auf jeden Fall raten die Sache unbedingt erst am wirklichen Close berechnen zu lassen, die Variante einen Trade während das 'Barwachstums' einzugehen ist alles andere als effektiv.

 

Viel Erfolg!

Hallo Maerl

auch dir eine Danke für die Antwort,ich werde mich Morgen wieder melden.

Bis denne

Geschrieben
  • Autor
Nochmal langsam:

 

Was der EA gerade tut (nur für den Long Fall):

1. Bei jedem Tick werden die aktuellen GDs berechnet (die sich auch bei jedem Tick ändern), zusätzlich werden die GDs auf Basis des letzten bereits fertigen Bars (also Close[1]) berechnet (diese ändern sich nicht mehr).

2. Es wird verglichen: "Gilt für die aktuellen GDs schneller > mittlerer > langsamer" und "Gilt für die "alten" GDs schneller < mittlerer". Wenn ja wird Position eröffnet.

 

 

Eine Kreuzung liegt vor, wenn für den vorigen Bar gilt "schneller < mittlerer" und für den aktuellen Bar gilt "schnell > mittlerer".

 

Es gäbe 2 Varianten: Betrachtet man die GDs immer nur am Ende eines Bars (also nur die endgültigen Werte die sich nicht mehr ändern) oder betrachtet man sie auch mittendrin.

 

Du hast geschrieben das du die "auch mittendrin" Variante betrachten willst und genau das tut der EA.

 

Also entweder du hast den Code inzwischen verändert, oder du willst das der EA was anderes tut als du hier geschrieben hast, weil die Einstiege vom EA tun gerade genau das was du hier an Anforderung geschrieben hast.

das muß ich mir noch mal durch den Kopf gehen lassen,ich melde mich morgen wieder

Bis denne

Geschrieben
  • Autor
Wenn man aktuell auf einen Chart schaut und sich die Kreuzungen begutachtet, hat man eine finale Variante der Kreuzungen vor Augen. Das Handelssystem durchläuft eine Unmenge dieser Varianten und agiert entsprechend mit Long/Short. Sofern eingebaut ist, dass bei bestehenden Orders keine neue Order hinzugefügt wird, bleibt es bei der ersten Kreuzung, die das System an dem jeweiligen Bar erkennt. Sofern das System nicht auf Close-Basis arbeitet wird dein System mit sehr hoher Wahrscheinlichkeit zu völlig irren Zeitpunkten in den Markt gehen, die im Nachhinein nicht nachvollziehbar sind, da man dann wohlgemerkt nur die eine finale Variante sehen kann.

 

Ich denke, in etwa ist dir das klar, ich kann dir auf jeden Fall raten die Sache unbedingt erst am wirklichen Close berechnen zu lassen, die Variante einen Trade während das 'Barwachstums' einzugehen ist alles andere als effektiv.

 

Viel Erfolg!

Hallo,was meinst du mit " Das System ncht auf Close-Basis arbeitet"?

mfg

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

Account

Navigation

Suche

Suche

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.