Frage für Kenner

 

Hallo. Programmierungsexperten können helfen.

Expert Advisor: Kaufen - Kreuzung der Stochastik und des Signals im überverkauften Bereich (unter 25), unter der Voraussetzung, dass

Der Pivot liegt unterhalb des Kursniveaus (eine Art Unterstützung); im Gegensatz dazu liegt der Pivot oberhalb des Kursniveaus.

Die Tests haben einige Programmierfehler ergeben. 1) Wie eröffne ich nur einen Handel pro Signal (beim Testen habe ich alles verloren, wenn das Signal noch aktiv ist (falsch) und die Bedingung der Positionsschließung bereits eingetreten ist). 2) ob ich die Bedingung, dass der Pivot über/unter dem Preisniveau liegt, richtig gesetzt habe. Ich habe Zweifel, wenn ich mir die Grafik des Tests ansehe.

Wenn ich mit konkreten Beispielen helfen kann. Ich kenne das Programmieren auf der Ebene des einfachen Kompilierens !!!!!!!.

extern double Lots = 0.1;

//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
double P_up0,P_down0,P_up1,P_down1;
double st_m1,st_s1,st_m2,st_s2,Pivot,ma_s1;
int cnt, ticket, total;

if(Balken<100)
{
Print("Balken kleiner als 100");
zurück(0);
}
P_up0=iCustom(0,0, "Preiskanal",11,0,0);
P_down0=iCustom(0,0, "Preiskanal",11,1,0);
P_up1=iCustom(0,0, "Preiskanal",11,0,1);
P_down1=iCustom(0,0, "Preiskanal",11,1,1);
st_m1=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_MAIN,1);
st_s1=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_SIGNAL,1);
st_m2=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_MAIN,2);
st_s2=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_SIGNAL,2);
Pivot=iCustom(0,0,Pivot,0,1);
ma_s1=iMA(0,0,4,0,MODE_SMA,PRICE_CLOSE,1);
//alle Daten einstellen

total=AuftragsSumme();
if(gesamt<1)
{
// Prüfung auf freien Spielraum
if(KontoFreieMarge()<(1000*Lose))
{
Print("Wir haben kein Geld. Freie Marge = ", AccountFreeMargin();
zurück(0);
}
// Bedingung für die Öffnung der BUY-Position
if(st_m2>st_s2&&st_m1>st_s1&&st_m2<25&&Pivot<ma_s1)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,",0,0,0,Green);
if(Ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
}
else Print("Fehler beim Öffnen der BUY-Bestellung: ",GetLastError());
zurück(0);
}
//Bedingung der offenen SELL-Position
if(st_m2<st_s2&&st_m1<st_s1&&st_m2>75&&Pivot>ma_s1)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,",0,0,0,Red);
if(Ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice())
}
else Print("Fehler bei der Eröffnung einer SELL-Order: ",GetLastError());
zurück(0);
}
zurück(0);
}
for(cnt=0;cnt<Gesamt;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL &&
AuftragSymbol()==Symbol())
{
if(OrderType()==OP_BUY) // Long-Position eröffnet
{
// Bedingung für die Schließung der Long-Position
if(P_down1>P_down0)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);
zurück(0);
}
}
sonst
{
// Bedingung für die Schließung der Short-Position
if(P_up1<P_up0)
{
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet);
zurück(0);
}
}
}
}
zurück(0);
}




Dateien:
pivot.mq4  2 kb
 
Kostay:

Hallo. Programmierungsexperten können helfen.

Expert Advisor: Kaufen - Kreuzung der Stochastik und des Signals im überverkauften Bereich (unter 25), unter der Voraussetzung, dass

Der Pivot liegt unterhalb des Kursniveaus (eine Art Unterstützung); im Gegensatz dazu liegt der Pivot oberhalb des Kursniveaus.

Die Tests haben einige Programmierfehler ergeben. 1) Wie eröffne ich nur einen Handel pro Signal (beim Testen habe ich alles verloren, wenn das Signal noch aktiv ist (falsch) und die Bedingung der Positionsschließung bereits eingetreten ist). 2) ob ich die Bedingung, dass der Pivot über/unter dem Preisniveau liegt, richtig gesetzt habe. Ich habe Zweifel, wenn ich mir die Grafik des Tests ansehe.

Wenn ich mit konkreten Beispielen helfen kann. Ich weiß, wie man auf der Ebene der einfachen Kompilierung programmiert!!!!!!!

extern double Lots = 0.1;

//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
double P_up0,P_down0,P_up1;
double st_m1,st_s1,st_m2,st_s2,Pivot,ma_s1;
int cnt, ticket, total;

if(Balken<100)
{
Print("Balken kleiner als 100");
zurück(0);
}
P_up0=iCustom(0,0, "Preiskanal",11,0,0);
P_down0=iCustom(0,0, "Preiskanal",11,1,0);
P_up1=iCustom(0,0, "Preiskanal",11,0,1);
P_down1=iCustom(0,0, "Preiskanal",11,1,1);
st_m1=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_MAIN,1);
st_s1=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_SIGNAL,1);
st_m2=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_MAIN,2);
st_s2=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_SIGNAL,2);
Pivot=iCustom(0,0,Pivot,0,1);
ma_s1=iMA(0,0,4,0,MODE_SMA,PRICE_CLOSE,1);
//alle Daten einstellen

total=AuftragsSumme();
if(gesamt<1)
{
// Prüfung auf freien Spielraum
if(KontoFreieMarge()<(1000*Lose))
{
Print("Wir haben kein Geld. Freie Marge = ", AccountFreeMargin();
zurück(0);
}
// Bedingung für die Öffnung der BUY-Position
if(st_m2>st_s2&&st_m1>st_s1&&st_m2<25&&Pivot<ma_s1)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,",0,0,0,Green);
if(Ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
}
else Print("Fehler beim Öffnen einer BUY-Bestellung: ",GetLastError());
zurück(0);
}
//Bedingung der offenen SELL-Position
if(st_m2<st_s2&&st_m1<st_s1&&st_m2>75&&Pivot>ma_s1)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,",0,0,0,Red);
if(Ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice())
}
else Print("Fehler bei der Eröffnung einer SELL-Order: ",GetLastError());
zurück(0);
}
zurück(0);
}
for(cnt=0;cnt<Gesamt;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL &&
AuftragSymbol()==Symbol())
{
if(OrderType()==OP_BUY) // Long-Position eröffnet
{
// Bedingung für die Schließung der Long-Position
if(P_down1>P_down0)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);
zurück(0);
}
}
sonst
{
// Bedingung für die Schließung der Short-Position
if(P_up1<P_up0)
{
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet);
zurück(0);
}
}
}
}
zurück(0);
}

1) wie man nur ein Geschäft auf ein Signal hin öffnen kann

Ich brauche es so:

if(total<1) 
     {
      if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }
         

if(st_m2>st_s2&&st_m1>st_s1&&st_m2<25&&Pivot<ma_s1)
{

         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",0,0,Green);

         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
               Alert("Покупка: ",OrderOpenPrice());                      
           }
         else Alert("ошибка:по цене ",OrderOpenPrice()); 
         return(0); 
        }
        
        
     return(0);
     }
 
Ich habe meine gesamte Einlage an der gleichen Stelle verloren!
 

Ich verstehe immer noch nicht, was ich an diesem Code geändert habe. Es scheint derselbe zu sein!

Und wie kann ich ihn so programmieren, dass er nur eine Position pro Signal öffnet?

Und wenn eine Position auf demselben Balken geschlossen wurde (d.h. das Signal ist noch aktiv), dann sollte keine neue Position eröffnet werden.

 
Kostay:

...Aber wie kann ich ihn so programmieren, dass er nur eine Position pro Signal öffnet?

Und wenn eine Position auf demselben Balken geschlossen wurde (d.h. das Signal ist noch aktiv), dann sollte keine neue Position eröffnet werden.

Wenn der Zeitpunkt der Eröffnung der Aufträge, einschließlich der geschlossenen, zum aktuellen Balken gehört (auf dem das Signal erschienen ist), dann rauchen wir auf dem Zaun.

Ungefähr so:

bool flag=true;
int cnt=OrdersTotal()-1;
for(int i=cnt;i>=0;i--) {
   if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
   if(OrderOpenTime()>=Time[0]) { // Time[0] - если позиция открывается на нулевом баре текущего символа
      flag=false;
      break;
   }
}
cnt=OrdersHistoryTotal()-1;
for(i=cnt;i>=0;i--) {
   if(!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY )) continue;
   if(OrderOpenTime()>=Time[0]) { // Time[0] - если позиция открывается на нулевом баре текущего символа
      flag=false;
      break;
   }
}
if(!flag) return; 
 

Wie kann mehr als 1 Position gleichzeitig offen sein, wenn dies der Fall ist?

total=OrdersTotal();
if(total<1)

?
 

Ich habe Ihren Code in den EA eingefügt, aber das Ergebnis ist das gleiche.

Ich muss den Rahmen falsch eingefügt haben. Bitte sehen Sie es sich an.

extern double Lots = 0.1;
bool flag=true;
//+------------------------------------------------------------------+
//|
//+------------------------------------------------------------------+
int start()
{
double P_up0,P_down0,P_up1,P_down1;
double st_m1, st_s1, st_m2, st_s2,Pivot,ma_s1;
int cnt, ticket, total;

if(Bars<100)
{
Print("bars less than 100");
return(0);
}
P_up0=iCustom(0,0, "Preiskanal",11,0,0);
P_down0=iCustom(0,0, "Preiskanal",11,1,0);
P_up1=iCustom(0,0, "Preiskanal",11,0,1);
P_down1=iCustom(0,0, "Preiskanal",11,1,1);
st_m1=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_MAIN,1);
st_s1=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_SIGNAL,1);
st_m2=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_MAIN,2);
st_s2=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_SIGNAL,2);
Pivot=iCustom(0,0, "Pivot",0,1);
ma_s1=iMA(0,0,4,0,MODE_SMA,PRICE_CLOSE,1);
//alle Daten setzen

total=OrdersTotal();
if(total<1)
{
// Freie Marge prüfen
if(AccountFreeMargin()<(1000*Lots))
{
Print("Wir haben kein Geld. Freie Marge = ", AccountFreeMargin());
return(0);
}
// Bedingung für die Eröffnung einer BUY-Position
if(st_m2>st_s2&st_m1>st_s1&st_m2<25&&Pivot<ma_s1)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",0,0,Green);

if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)
Alert("Kauf: ",OrderOpenPrice());
}
else Alert("Fehler:Preis ",OrderOpenPrice());
return(0);
}
int cn=OrdersTotal()-1;
for(int i=cn;i>=0;i--) {
if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
if(OrderOpenTime()>=Time[0]) { // Time[0] - wenn die Position auf dem Nullbar des aktuellen Symbols eröffnet
flag=false;
break;
}
}
cnt=OrdersHistoryTotal()-1;
for(i=cn;i>=0;i--) {
if(!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY )) continue;
if(OrderOpenTime()>=Time[0]) { // Time[0] - wenn die Position auf dem Null-Bar des aktuellen Symbols eröffnet wird
flag=false;
break;
}
}
if(!flag) return;
// Bedingung für die Eröffnung einer SELL-Position
if(st_m2<st_s2&st_m1<st_s1&st_m2>75&&Pivot>ma_s1)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,",0",0,0,Red);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)
Alert("Kauf: ",OrderOpenPrice());
}
else Alert("Fehler:Preis ",OrderOpenPrice());
return(0);
}
int c=OrdersTotal()-1;
for(int a=c;a>=0;a--) {
if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
if(OrderOpenTime()>=Time[0]) { // Time[0] - wenn die Position auf dem Nullbar des aktuellen Symbols eröffnet
flag=false;
break;
}
}
cnt=OrdersHistoryTotal()-1;
for(a=c;a>=0;a--) {
if(!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY )) continue;
if(OrderOpenTime()>=Time[0]) { // Time[0] - wenn die Position auf dem Nullbar des aktuellen Symbols eröffnet
flag=false;
break;
}
}
if(!flag) return;
return(0);
}
for(cnt=0;cnt<Gesamt;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL &&
OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY) // Long-Position eröffnet
{
// Bedingung zum Schließen der Long-Position
if(P_down1>P_down0)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet)
return(0);
}
}
else
{
// Bedingung für das Schließen von Short-Positionen
if(P_up1<P_up0)
{
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet);
return(0);
}
}
}
}
return(0);
}




 
D500_Rised:

Wie kann mehr als 1 Position gleichzeitig offen sein, wenn dies der Fall ist?

total=OrdersTotal();
if(total<1)

?

Sie missverstehen. Es wird nicht mehr als 1 Position gleichzeitig geöffnet!!!!!!! Signal erschien - Position geöffnet. auf dem gleichen Null-Bar der Preis ging in die entgegengesetzte Richtung und die Bedingung der Schließung der Position ist gültig. es ist entsprechend geschlossen, auf dem gleichen Null-Bar. Die Position öffnet und schließt sich wieder, da sie in die entgegengesetzte Richtung geht.

Die Frage ist also, wie man ein Signal dazu bringt, nur eine Position zu öffnen, auch wenn sie mit einem neuen Tick geschlossen wird!

 
Dann müssen Sie ein Verbot auf intrabar Handel machen gehen durch die Suche mit diesen Keywords, werden Sie es finden.
 
Kostay:

Ich habe Ihren Code in den EA eingefügt, aber das Ergebnis ist das gleiche.

Ich muss den Code falsch eingegeben haben.

Bitte, aber das nächste Mal fügen Sie den Code über die Schaltfläche

Es sollten keine Fehler auftreten, aber ich habe es nicht getestet.

extern double Lots = 0.1;

//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start() {
   double P_up0,P_down0,P_up1,P_down1;
   double st_m1, st_s1, st_m2, st_s2,Pivot,ma_s1;
   int i, cnt, ticket, total;
   bool flag=true;

   if(Bars<100) {
      Print("bars less than 100");
      return(0); 
   }
// Проверяем стоит ли открываться
   
   cnt=OrdersHistoryTotal()-1;
   for(i=cnt;i>=0;i--) {
      if(!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY )) continue;
      if(OrderOpenTime()>=Time[0]) { // Time[0] - если позиция открывается на нулевом баре текущего символа
         flag=false;
         break;
      }
   }
   cnt=OrdersTotal()-1;
   for(i=cnt;i>=0;i--) {
      if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
      if(OrderOpenTime()>=Time[0]) { // Time[0] - если позиция открывается на нулевом баре текущего символа
         flag=false;
         break;
      }
   }
   if(!flag) return(0); 
//-----------------------------------------------
   P_up0=iCustom(0,0,"Ценовой канал",11,0,0);
   P_down0=iCustom(0,0,"Ценовой канал",11,1,0);
   P_up1=iCustom(0,0,"Ценовой канал",11,0,1);
   P_down1=iCustom(0,0,"Ценовой канал",11,1,1);
   st_m1=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_MAIN,1);
   st_s1=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_SIGNAL,1);
   st_m2=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_MAIN,2);
   st_s2=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_SIGNAL,2);
   Pivot=iCustom(0,0,"Pivot",0,1);
   ma_s1=iMA(0,0,4,0,MODE_SMA,PRICE_CLOSE,1);
//задали все данные 

// Проверка свободной маржи
   if(AccountFreeMargin()<(1000*Lots)) {
      Print("We have no money. Free Margin = ", AccountFreeMargin());
      return(0); 
   }
      
// Условие открытие позиции BUY
   if(st_m2>st_s2&&st_m1>st_s1&&st_m2<25&&Pivot<ma_s1) {
      ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",0,0,Green);
      if(ticket>0) {
         if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
            Alert("Покупка: ",OrderOpenPrice()); 
      }  else Alert("ошибка:по цене ",OrderOpenPrice()); 
      return(0); 
   }
      
// Условие открытие позиции SELL
   if(st_m2<st_s2&&st_m1<st_s1&&st_m2>75&&Pivot>ma_s1) {
      ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"",0,0,Red);
      if(ticket>0) {
         if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
            Alert("Покупка: ",OrderOpenPrice()); 
      }  else Alert("ошибка:по цене ",OrderOpenPrice()); 
      return(0); 
   }
  
   for(i=cnt;i>=0;i--) {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL && OrderSymbol()==Symbol()) {
         if(OrderType()==OP_BUY) {// длинная позиция открыта
// условие закрытие длинной позиции
            if(P_down1>P_down0) {
               OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); 
               return(0); 
            }
         }  else {
// условие закрытия короткой позиции
               if(P_up1<P_up0) {
                  OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); 
                  return(0); 
               }
            }
      }
   }
   return(0);
}
 

Die seltsame Sache ist los mit dem Expert Advisor jetzt. es ist nicht mit der Position Schließungen arbeiten. es kann mehrere Positionen des gleichen Typs offen und aktiv zur gleichen Zeit sein. Und das Ergebnis: Alle verlieren an demselben Problem, wenn auch in einer veränderten Version!

Grund der Beschwerde: