[ARCHIV] Alle Fragen von Anfängern, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Nirgendwo ohne dich - 3. - Seite 497

 
sss2019:

Sagen Sie mir, wie man einen EA für diese Bedingung schreibt:

Es gibt drei Währungspaare, auf denen der EA Geschäfte eröffnen wird, und der EA ist nur mit einem Chart verbunden, während er auf den anderen beiden selbständig arbeitet, im Allgemeinen in mehreren Währungen.

Die zweite Bedingung ist, dass ein Geschäft eröffnet wird, wenn der Preis für eines der Währungspaare ein bestimmtes Niveau erreicht. Es kann jeweils nur ein Geschäft geöffnet werden.

Sobald das Geschäft geschlossen ist, kann der Expert Advisor das Geschäft bei jedem beliebigen Paar wieder öffnen, wenn sich der Preis nähert.

Ich habe eine statische Variable so eingestellt, dass die Geschäfte eröffnet werden können, solange der Wert der Variable false ist, und sobald der Auftrag für eines der Paare eröffnet wird, nimmt die Variable den Wert true an. Sobald der Auftrag geschlossen ist und die for-Schleife keinen Handel findet, nimmt die Variable wieder den Wert false an.

Und wenn zum Beispiel für jedes Paar nur ein Handel eröffnet werden soll, bedeutet das, dass jedes Paar seine eigene Variable hat.

Gibt es eine rationalere Lösung für dieses Problem?


Es gibt einen Parameter wie "Magik" in der Bestellung - zählen Sie einfach Bestellungen mit einer bestimmten Magik und erlauben oder verbieten Sie den Handel.
 

Wie schließe ich Aufträge korrekt ab und wie sammle ich Informationen über sie?

Ich habe folgenden Algorithmus geschrieben: Ich möchte eine Kaufposition eröffnen, wenn der Eröffnungskurs unter dem Fraktal nach oben und der Schlusskurs über dem Fraktal nach oben liegt, und eine Verkaufsposition, wenn der Eröffnungskurs über dem Fraktal nach unten und der Schlusskurs darunter liegt; außerdem möchte ich alle Positionen schließen, wenn sie um 85 Punkte unterschritten werden oder wenn der Auftrag innerhalb von 38 Kerzen (const. S) eröffnet wird.)Ich habe das Gefühl, dass überhaupt nichts geschlossen wird, nur geschlossene Aufträge, und im Allgemeinen habe ich das Gefühl, dass ich mit Aufträgen auf die falsche Weise umgehe, ich arbeite falsch und schließe sie dann auf die falsche Weise)) Bitte sagen Sie mir, wie ich sie richtig schließe, damit sie nicht durchrutschen und wo es Fehler in diesem Code gibt. Oder kann ein Beispiel dafür sein, wie nyu gehen, in denen alle diese Operationen angemessen durchgeführt werden. Vielen Dank im Voraus für Ihre Hilfe).


extern int S=38; //Anzahl der Candlesticks, nach denen die Position geschlossen wird
extern int SL=85; //der Stop, bei dem die Positionen auf jeden Fall geschlossen werden
extern int HIGH=0; //auf welchem Zeitrahmen nach Extremen gesucht wird (5 oder 1 oder 0(D1))
extern int l=1; //Anzahl der zu handelnden Lots
int massorder[30][30]; //es gibt Daten zu OPEN Lots
int numb=1; //die Anzahl der el-ta im Array, die oot ist. Los eröffnen
int i=0;
int ticket=0;
int x=0;
double down,up=0;
double highH1,lowH1=0;

int start()

{
if(Hour()>x)
{
searchH1();
up=highH1;
down=lowH1;
i++;
}
//----
if(Open[1]<up && Close[1]>up)//wenn die Kerze bei der Eröffnung niedriger und bei der Schließung niedriger ist als das fraktale Niveau oben, dann
{
ticket=OrderSend(Symbol(),OP_BUY,l,Bid,5,Bid-SL*Point,NULL);
i=0;
savedata();
}
if(Open[1]>down && Close[1]<down)//wenn die Kerze am Open höher und am Close niedriger ist als das Down-Fraktal-Level, dann
{
ticket=OrderSend(Symbol(),OP_SELL,l,Ask,5,Ask+SL*Point,NULL);
i=0;
savedata();
}
if(i==S)
{
closeAllticket();
closeAllPos();
}
i++;
//----
x=Hour();
if(Hour()==23)
x=-1;
return(0);
}
//+------------------------------------------------------------------+
void closeAllticket()
{
for(int j=0;j<=numb;j++)
{
OrderClose(massorder[j][0],l,Ask,5);
OrderClose(massorder[j][0],l,Bid,5);
}
numb=0;
}
void closeAllPos()
{

for(int j=0;j<=OrdersTotal();j++)
{
OrderSelect(j,SELECT_BY_POS);
OrderClose(OrderTicket(),l,Ask,5);
OrderClose(OrderTicket(),l,Bid,5);
}
}
void searchH1()//Funktion zum Finden des Fraktals
{
if(iHigh(Symbol(),PERIOD_H1,3)>iHigh(Symbol(),PERIOD_H1,2) && iHigh(Symbol(),PERIOD_H1,3)>iHigh(Symbol(),PERIOD_H1,1) &&& iHigh(Symbol(),PERIOD_H1,3)>iHigh(Symbol(),PERIOD_H1,4) && iHigh(Symbol(),PERIOD_H1,3)>iHigh(Symbol(),PERIOD_H1,5))
highH1=iHigh(Symbol(),PERIOD_H1,3)

if(iHigh(Symbol(),PERIOD_H1,3)<iHigh(Symbol(),PERIOD_H1,2) && iHigh(Symbol(),PERIOD_H1,3)<iHigh(Symbol(),PERIOD_H1,1) && iHigh(Symbol(),PERIOD_H1,3)<iHigh(Symbol(),PERIOD_H1,4) && iHigh(Symbol(),PERIOD_H1,3)<iHigh(Symbol(),PERIOD_H1,5))
lowH1=iHigh(Symbol(),PERIOD_H1,3);
return (0);

}

void savedata() //Programm zum Speichern von Daten im Array
{

OrderSelect(ticket,SELECT_BY_TICKET);
massorder[numb][0]=OrderTicket();
massorder[numb][1]=OrderOpenPrice();
massorder[numb][2]=OrderStopLoss();
massorder[numb][3]=OrderTakeProfit();
if(OrderType()==OP_BUY)
massorder[numb][4]=0;
if(OrderType()==OP_SELL)
massorder[numb][4]=1;
numb++;

}
 
Qwertee:

Wie schließe ich Aufträge korrekt ab und wie sammle ich Informationen über sie?

Ich habe folgenden Algorithmus geschrieben: Ich möchte eine Kaufposition eröffnen, wenn der Eröffnungskurs unter dem Fraktal nach oben und der Schlusskurs über dem Fraktal nach oben liegt, und eine Verkaufsposition, wenn der Eröffnungskurs über dem Fraktal nach unten und der Schlusskurs darunter liegt; außerdem möchte ich alle Positionen schließen, wenn sie um 85 Punkte unterschritten werden oder wenn der Auftrag innerhalb von 38 Kerzen (const. S) eröffnet wird.)Ich habe das Gefühl, dass überhaupt nichts geschlossen wird, nur geschlossene Aufträge, und im Allgemeinen habe ich das Gefühl, dass ich mit Aufträgen auf die falsche Weise umgehe, ich arbeite falsch und schließe sie dann auf die falsche Weise)) Bitte sagen Sie mir, wie ich sie richtig schließe, damit sie nicht durchrutschen und wo es Fehler in diesem Code gibt. Oder kann ein Beispiel dafür sein, wie nyu gehen, in denen alle diese Operationen angemessen durchgeführt werden. Vielen Dank im Voraus für Ihre Hilfe).


In globalen Variablen, bei denen Sie am Anfang Stopps angegeben haben

extern int MagicNumber = 11113;
int cntBuy = 0, cntSell = 0, totalBuy, totalSell;

bevor Sie Aufträge eröffnen:

           totalBuy = CountTradesBuy();
           totalSell = CountTradesSell();

im Signal zum Öffnen

if((Open[1]<up) && (Close[1]>up) && (totalBuy < 1) && (totalSell < 1))

if((Open[1]>down) && (Close[1]<down) && (totalBuy < 1) && (totalSell < 1))

am Ende des EA

int CountTradesBuy() {
   int countBuy = 0;
   for (int tradeBuy = OrdersTotal() - 1; tradeBuy >= 0; tradeBuy--) {
      OrderSelect(tradeBuy, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
         if (OrderType() == OP_BUY) countBuy++;
   }
   return (countBuy);
}

int CountTradesSell() {
   int countSell = 0;
   for (int tradeSell = OrdersTotal() - 1; tradeSell >= 0; tradeSell--) {
      OrderSelect(tradeSell, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
         if (OrderType() == OP_SELL) countSell++;
   }
   return (countSell);
}

Ich schätze, ich habe nichts vergessen.

 
belck:


in den globalen Variablen, wo Sie die Haltestellen am Anfang angegeben haben

bevor die Bestellungen eröffnet wurden:

im Signal zum Öffnen

am Ende des EA

als ob nichts vergessen worden wäre



Ich habe alles, was Sie schrieb, aber immer noch nichts hat sich aus irgendeinem Grund geändert. das Ergebnis ist das gleiche wie es war und immer noch bleibt, Aufträge bleiben offen für eine große Menge an Zeit, und ich brauche sie nach S Bars zu schließen, was ist das Problem ?????????????????

Dateien:
ikdgna.mq4  7 kb
 
Qwertee:


Ich habe alles, was Sie schrieb, aber immer noch nichts geändert hat. das Ergebnis ist, wie es war und wie es jetzt ist, Aufträge sind immer noch offen eine Menge Zeit und ich brauche sie nach S Bars zu schließen, was ist der Deal?????????????????

Der Aufruf zur Schließung von Aufträgen sollte vor der Eröffnung von Aufträgen erfolgen. Ich habe diese auf Schließung:

vor der weltweit größten

#include <stdlib.mqh>


Ich habe es vor der Eröffnung von Aufträgen so formuliert:

if ()
   {
    CloseAllBuy();
    }
    
       
   if () 
   {
   CloseAllSell();
   }

или

if ()
   {
    CloseAllBuy();
    CloseAllSell();
     }

und dies ganz am Ende des EA

void CloseAllBuy()
{
        int i;
        int Orders = OrdersTotal();
        bool result;
        datetime begin;
        
        if(Orders > 0)
        {
                for(i = Orders-1; i >= 0; i--)
                {
                        if( OrderSelect(i, SELECT_BY_POS, MODE_TRADES) )
                        {
                                if(OrderSymbol() == Symbol() && OrderType() == OP_BUY && OrderMagicNumber() == MagicNumber)
                                {
                                        RefreshRates();
                                        begin = TimeCurrent();
                    result = OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid, Digits), slip, Yellow); // закрываем все встречные ордера
                                        while(!result && TimeCurrent() - begin <= 60 && !IsTesting())
                                        {
                                                Sleep(100);
                                                RefreshRates();
                    result = OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid, Digits), slip, Yellow);//закрываем все встречные ордера
                                        }
                                        if(!result)
                                        {
                                                int error = GetLastError();
                                                Print("Ошибка закрытия ордера BUY #" + OrderTicket() + " " + ErrorDescription(error));
                                        }
                                }
                        }
                        else
                        {
                                Print("Не удалось выбрать открытый ордер:" + ErrorDescription(error));
                        }
                }
        }
}

void CloseAllSell()
{
        int i;
        int orders = OrdersTotal();
        bool result;
        datetime begin;
        
        if(orders > 0)
        {
                for(i = orders-1; i >= 0; i--)
                {
                        if( OrderSelect(i, SELECT_BY_POS, MODE_TRADES) )
                        {
                                if(OrderSymbol() == Symbol() && OrderType() == OP_SELL && OrderMagicNumber() == MagicNumber)
                                {
                                        RefreshRates();
                                        begin = TimeCurrent();
                    result = OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask, Digits), slip, Yellow); // закрываем все встречные ордера
                                        while(!result && TimeCurrent() - begin <= 120 && !IsTesting())
                                        {
                                                Sleep(100);
                                                RefreshRates();
                   result = OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask, Digits), slip, Yellow);//закрываем все встречные ордера
                                        }
                                        if(!result)
                                        {
                                                int error = GetLastError();
                                                Print("Ошибка закрытия ордера SELL #" + OrderTicket() + " " + ErrorDescription(error));
                                        }
                                }
                        }
                        else
                        {
                                Print("Не удалось выбрать открытый ордер:" + ErrorDescription(error));
                        }
                }
        }
}

 

Frage an die Experten, gibt es irgendwelche Kriterien für EAs, wie z.B. die Mindestanzahl von Lots für einen bestimmten Zeitraum des Tests? Prozentsatz des Verlustes, usw.?

Ich habe nur 2 EAs, und sie machen 100 Trades pro Jahr, und ein anderer macht insgesamt 30 Trades... (Zeitrahmen 15 bzw. 30). Die Rentabilität ist gut, die erste ist in einer Demo auf echte Angebote, es ist jetzt getestet ... Aber kann mir jemand sagen, wenn es eine bessere ... Aber vielleicht kann mir jemand sagen, ob es bessere Tests als in MT4 gibt?

 
Können Sie mir sagen, wie man eine Bedingung ausführt? Wir haben eine Bedingung, um einen Kaufauftrag zum aktuellen Preis zu eröffnen, sobald der Preis 1,2550 erreicht. Wenn also der Preis höher oder gleich 1,2550 ist, wird die Order eröffnet, und wenn die Order eröffnet ist, blockiert die statische Variable die Eröffnung neuer Orders, bis die Order 0 erreicht. Sobald die Order geschlossen ist und es keine weiteren Orders mit dieser Magie gibt, wird das Eröffnungsverbot aufgehoben und eine neue Order eröffnet, aber der Preis hat sich längst von diesem Niveau entfernt. Wir brauchen den Expert Advisor, um Marktaufträge zu eröffnen, wenn der Preis dieses Niveau erreicht, nicht die schwebenden Aufträge.
 

Hallo an alle Genießer))))

Es gibt einen Indikator, der eine Trendlinie auf den letzten beiden Fraktalen zeichnet, aber er zeichnet sie nach einem "unbestätigten Fraktal", d.h. der zweite Balken hat sich noch nicht nach dem Fraktal gebildet, aber die Linie wurde bereits gezeichnet. Wie kann man erreichen, dass nach dem zweiten Takt gezeichnet wird, aber nicht nach dem ersten? Der Indikator befindet sich auf der Registerkarte.

Dateien:
 
rigc:

Hallo an alle Genießer))))

Es gibt einen Indikator, der eine Trendlinie auf den letzten beiden Fraktalen zeichnet, aber er zeichnet sie nach einem "unbestätigten Fraktal", d.h. der zweite Balken hat sich noch nicht nach dem Fraktal gebildet, aber die Linie wurde bereits gezeichnet. Wie kann man erreichen, dass es nach dem zweiten Takt gezeichnet wird, aber nicht nach dem ersten? Der Indikator befindet sich auf der Registerkarte.


Versuchen Sie
Dateien:
 
Figar0:

Versuchen Sie
überhaupt nicht zeichnen)))