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

 

Der EA hat den folgenden Block (Ereigniszähler):

if (isCloseLastPosByStop()==True) //Wenn der letzte Auftrag durch Stop geschlossen wurde

{
N=N+1;
Alert(N, "Elch");
} sonst N=0;

FRAGE: Wie kann man die Daten in eine Datei (Excel) schreiben, anstatt sie auf dem Bildschirm anzuzeigen?

 
Dimka-novitsek:

Guten Tag, könnten Sie mir sagen, wie es sein kann, wähle ich eine Bestellung in einer Schleife, gehe ich durch die Bestellung ist zuletzt und speichern Sie es so ticket = OrderTicket();

In diesem Fall sagen wir, es ist die Nummer zwei. Etwas später, wenn (Ticket>-1){
OrderSelect(ticket,SELECT_BY_TICKET,MODE_HISTORY);

und ich bekomme oft die Fehlermeldung 4105 - Bestellung nicht ausgewählt!!!


Und das liegt daran, dass der Auftrag noch nicht abgeschlossen ist. Sie befindet sich nicht in MODE_HISTORY, sondern immer noch in MODE_TRADES.
 

for(  i=0;i<=OrdersHistoryTotal();i++){
    OrderSelect(i ,SELECT_BY_POS,MODE_HISTORY);
     if (OrderMagicNumber( )== magic) { if(OrderSymbol()== Symbol()) {





 current = OrderOpenTime();  Alert ( " current = OrderOpenTime(); ",  current);Alert ( " max ", max );
      
      if (current > max) 
      {                    
         max = current;      
         ticket = OrderTicket();   Alert ( " ticket = OrderTicket();  ", ticket );
      }}}}


       if (ticket>-1){
      OrderSelect( ticket,SELECT_BY_TICKET,MODE_HISTORY);Alert ("SELL Select error HISTORYticket ", GetLastError( )  ) ;

Niemals! Warum nicht? Zum Zeitpunkt der Überschreitung gab es keine offenen Aufträge! Vielleicht verstehe ich das nicht.

Der Suchzyklus ist ebenfalls Geschichte! Dort weise ich sie der Variablen int ticket zu!

Und es schwört, Entschuldigung, 2012.02.04 11:28:47 2011.12.06 16:35 GMT EURUSD,M30: Alert: SELL Select Fehler HISTORYticket 4105

Wenn er von MODE_HISTORY zu MODE_TRADES?

Und das Wichtigste ist, dass ich denselben Auftrag in der Historie mit Hilfe von order select auswähle, und er ist zuerst ausgewählt, sonst könnte ich nicht damit arbeiten! Es gibt keine Logik !!!!!! Ich bin schockiert...




 
Dimka-novitsek:

Niemals! Warum nicht? Zum Zeitpunkt der Überschreitung gab es keine offenen Aufträge! Vielleicht verstehe ich das nicht.

Der Suchzyklus ist ebenfalls Geschichte! Dort weise ich sie der Variablen int ticket zu!

Und es schwört, Entschuldigung, 2012.02.04 11:28:47 2011.12.06 16:35 GMT EURUSD,M30: Alert: SELL Select Fehler HISTORYticket 4105

Wenn er von MODE_HISTORY zu MODE_TRADES wechselt?


ticket=-1;
for(  i=0;i<OrdersHistoryTotal();i++){
    if (OrderSelect(i ,SELECT_BY_POS,MODE_HISTORY));{
     if (OrderMagicNumber( )== magic) { if(OrderSymbol()== Symbol()) {





 current = OrderOpenTime();  Alert ( " current = OrderOpenTime(); ",  current);Alert ( " max ", max );
      
      if (current > max) 
      {                    
         max = current;      
         ticket = OrderTicket();   Alert ( " ticket = OrderTicket();  ", ticket );
      }}}}}


       if (ticket>-1){
      OrderSelect( ticket,SELECT_BY_TICKETJ ,MODE_HISTORY);Alert ("SELL Select error HISTORYticket ", GetLastError( )  ) ;
Eine Zeile am Anfang hinzugefügt und die nächsten beiden Codezeilen korrigiert.
 
Ich danke Ihnen!!!
 

Hilfe beim Einfügen eines Stop Loss in einen EA

bitte

Dateien:
my_1.mq4  10 kb
 
Bitte teilen Sie uns die Funktion zur Berechnung des maximal zulässigen Loses unter Berücksichtigung der offenen Positionen, d.h. des Eigenkapitals, mit. Die Standardfunktion berechnet das Risiko, aber wenn es Geschäfte gibt, ist nicht genug Geld vorhanden, um sie zu öffnen
 
T-G:
Bitte teilen Sie uns die Funktion zur Berechnung des maximal zulässigen Loses unter Berücksichtigung der offenen Positionen, d.h. des Eigenkapitals, mit. Die Standardfunktion berechnet das Risiko, aber wenn es Geschäfte gibt, ist nicht genug Geld vorhanden, um sie zu öffnen


Im einfachsten Fall sieht es so aus:

double Klots = 0.1; //коэфф. риска (определяет желаемый размер лота от максимально возможного в данный момент.)

Lots=NormalizeDouble(Klots*AccountFreeMargin()/MarketInfo(Symbol(),MODE_MARGINREQUIRED),2);Lots=MathMax(MarketInfo(Symbol(),MODE_MINLOT),Lots);
 

Leute, könnt ihr diese Frage beantworten?

Hier ist ein Skript zur Ermittlung der maximalen Größe des Zick-Zack-Spiels von crenfx - siehe hier:

#property show_inputs

extern int MinPips = 100;
extern datetime StartTime = D'2011.03.24';
extern datetime EndTime = D'2011.12.31';

#define MAX_POINTS 10000

// Заполняет массив размерами колен ЗигЗага с условием колена >= MinPips пунктов
int GetZigZagData( int MinPips, datetime& StartTime, datetime& EndTime, int& Data[] )
{
  bool FlagUP = TRUE;
  int Pos = iBarShift(Symbol(), Period(), StartTime);
  int PosEnd = iBarShift(Symbol(), Period(), EndTime);
  int Max = High[Pos] / Point + 0.1;
  int Min = Low[Pos] / Point + 0.1;
  int Count = 0;
  int PriceHigh, PriceLow;
 
  StartTime = Time[Pos];
  EndTime = Time[PosEnd];
  
  ArrayResize(Data, MAX_POINTS);

  Pos--;
  
  while (Pos >= PosEnd)
  {
    PriceHigh = High[Pos] / Point + 0.1;
    PriceLow = Low[Pos] / Point + 0.1;   

    if (FlagUP)
    {
      if (PriceHigh > Max)
        Max = PriceHigh;
      else if (Max - PriceLow >= MinPips)
      {
        Data[Count] = Max - Min;
        Count++;
        
        FlagUP = FALSE;
        Min = PriceLow;
      }
    }
    else
    {
      if (PriceLow < Min)
        Min = PriceLow;
      else if (PriceHigh - Min >= MinPips)
      {
        Data[Count] = Max - Min;
        Count++;
        
        FlagUP = TRUE;
        Max = PriceHigh;
      }
    }
    
    Pos--;
  }
  
  ArrayResize(Data, Count);
    
  return(Count);
}

void start()
{
  int ZigZagData[];
  int Amount = GetZigZagData(MinPips, StartTime, EndTime, ZigZagData);
  
  ArraySort(ZigZagData);
  
  Print("На интервале " + TimeToStr(StartTime) + " - " + TimeToStr(EndTime) +
        " максимальное безоткатное (> " + MinPips +
        " пунктов) движение " + ZigZagData[Amount - 1] + " пунктов.");
        
  return;
}

Ich werfe es auf den Chart des Instruments auf M5 - es funktioniert gut mit dem Standard-Zeitrahmen

extern datetime StartTime = D'2011.03.24';
extern datetime EndTime = D'2011.12.31';

es ist die maximale Tiefe der Historie für das Symbol im Alpari-Büro, wenn es mit F2 geladen wird - ich habe es überprüft, d.h. es sieht aus wie der Inhalt der Registerkarte "Experten" des Client-Terminals - es scheint zu stimmen:

Wenn ich das gleiche Skriptdesign in meinem EA für das gleiche Zeitintervall auf dem gleichen M5-Chart verwende, wird es nicht korrekt gezählt, d.h..

berechnet er ganz andere (kleinere als im Skript) Zahlen oder 0. Worin kann der Fehler bestehen oder kann es sich um eine Art von historischer Inkonsistenz handeln? Ich danke Ihnen.

D.h. ich starte im Tester mit Eule nach der geschätzten Zeit für das Finden eines Failsafe, theoretisch ist alles normal und die Zahlen aus dem Skript und der Eule sollten die gleichen sein... Worin könnte der Fehler liegen?

 

So lade ich dieses Skript auf meine Eule:

extern string A3 = "Расчет безотката";
//РАСЧЕТ БЕЗОТКАТА ДЛЯ РАССТАВЛЕНИЯ ОРДЕРОВ С ЗАДАННЫМ ШАГОМ
extern int MinPips = 100;
extern datetime StartTime = D'2011.03.24';
extern datetime EndTime = D'2011.12.31';
#define MAX_POINTS 1000000

//extern double grid = 1000;          // размер безотката в пунктах



//+------------------------------------------------------------------+
//| Старт робота                                                     |
//+------------------------------------------------------------------+

int init()
{   
       
  //------------------     ШАГ СЕТКИ   ---------------------------------------------------------------------------------------

 //Pipstep = grid/Max_Iteration;
 //Pipstep = NormalizeDouble(Pipstep,0);  
 // СЧИТАЕМ БЕЗОТКАТ
    int ZigZagData[];
    int Amount = GetZigZagData(MinPips, StartTime, EndTime, ZigZagData);
  
    ArraySort(ZigZagData);
  
    Print("На интервале " + TimeToStr(StartTime) + " - " + TimeToStr(EndTime) +
        " максимальное безоткатное (> " + MinPips +
        " пунктов) движение " + ZigZagData[Amount - 1] + " пунктов.");        

  
   
    return (0);
}

...
...

// Заполняет массив размерами колен ЗигЗага с условием колена >= MinPips пунктов
int GetZigZagData( int MinPips, datetime& StartTime, datetime& EndTime, int& Data[] )
{
  bool FlagUP = TRUE;
  int Pos = iBarShift(Symbol(), Period(), StartTime);
  int PosEnd = iBarShift(Symbol(), Period(), EndTime);
  int Max = High[Pos] / Point + 0.1;
  int Min = Low[Pos] / Point + 0.1;
  int Count = 0;
  int PriceHigh, PriceLow;
 
  StartTime = Time[Pos];
  EndTime = Time[PosEnd];
  
  ArrayResize(Data, MAX_POINTS);

  Pos--;
  
  while (Pos >= PosEnd)
  {
    PriceHigh = High[Pos] / Point + 0.1;
    PriceLow = Low[Pos] / Point + 0.1;   

    if (FlagUP)
    {
      if (PriceHigh > Max)
        Max = PriceHigh;
      else if (Max - PriceLow >= MinPips)
      {
        Data[Count] = Max - Min;
        Count++;
        
        FlagUP = FALSE;
        Min = PriceLow;
      }
    }
    else
    {
      if (PriceLow < Min)
        Min = PriceLow;
      else if (PriceHigh - Min >= MinPips)
      {
        Data[Count] = Max - Min;
        Count++;
        
        FlagUP = TRUE;
        Max = PriceHigh;
      }
    }
    
    Pos--;
  }
  
  ArrayResize(Data, Count);
    
  return(Count);
}

Es scheint alles gleich zu sein - wo könnte der Fehler liegen?