Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 182

 
Artyom Trishkin:
Und Sie haben nicht ein einziges Stück Ihres Codes gezeigt - es ist nicht klar, warum Sie ein Beispiel zeigen.

struct p{

double trailingProfit;

int orders[10];

bool flagOpen;// флаг , указывающий на открытость позиции

//тут еще куча связанных параметров

};


p order[];

int OrderN=-1;


int OnInit()
  {

   ArrayResize(pair,1,1000);
 

   return(INIT_SUCCEEDED);
  }

void openOrder(price){

       OrderN++;

       int t;

       ArrayResize(orders,order+1);

      t=OrderSend(Symbol(),OP_BUYSTOP,2,(NormalizeDouble(price,Digits)),3,0,0,"pair",MAGICN,0,Blue);
      if(t==0) Print("не удалось выставить ордер BUYSTOP ", price);

      for(intj=0,j<10,++j){     

      if(orders[OrderN].orders==0) orders[OrderN].orders=t;

      break;

      }

      orders[OrderN].flagOpen=1;

}

//...... тут идет обработка позиций...

void massCut(){

// нужна вот такая функция

}

Wenn der EA lange Zeit arbeitet, wird das Array zu groß für die Verarbeitung und wir müssen es verkleinern. Alle alten abgeschlossenen Aufträge stehen am Anfang und alles nach dem ersten gefundenen offenen Auftrag sollte übrig bleiben.
 
Evgenii:

...
Wenn der EA über einen längeren Zeitraum läuft, wird das Array zu groß, um es zu verarbeiten, und wir müssen es reduzieren. Alle alten abgeschlossenen Aufträge stehen am Anfang, alles nach dem ersten gefundenen offenen Auftrag sollte übrig bleiben.

Was passiert mit dem Array von Strukturen, wenn der EA neu gestartet wird?

 
Artyom Trishkin:

Was passiert mit dem Struktur-Array, wenn der EA neu gestartet wird?

stürzt das Array ab, dieses Problem ist noch nicht gelöst.
 
Evgenii:
Das Array wird gelöscht, dieses Problem wurde nicht gelöst.

Dort. Und das hätte von vornherein bedacht werden müssen.

Die Schlussfolgerung liegt auf der Hand: Das Array muss auf Null gesetzt und mit dem aktuellen Stand der Aufträge und Positionen neu aufgefüllt werden. Dies sollte jedoch nur dann geschehen, wenn sich die Anzahl der Aufträge oder Positionen auf dem Konto ändert.

Sie haben immer nur den aktuellen Stand der Aufträge und Positionen zur Hand und müssen sich nicht darum kümmern, nicht existierende Aufträge/Positionen aus dem Array zu eliminieren. Und die Liste der Aufträge/Positionen muss vollständig oder für einen bestimmten Zeitraum durchgeblättert werden, aber nur in bestimmten Fällen - wenn sich die Anzahl der Aufträge/Positionen im Konto ändert.

 
Alexey Viktorov:
Warum brauchen Sie eine solche Perversion?

Damit OnInit nicht bei jeder Neuinitialisierung spinnt und das statische Array auf eine einzige Instanz reduziert, weil es an einigen Stellen doppelt geschrieben wird... im Allgemeinen ist dies eine Ressourcenoptimierung
... Ich werde es so lassen, wie es ist, es ist im Moment einfacher
 
LRA:
Sie deklarieren ein globales Array ohne Angabe einer Größe. Ihre Funktion setzt ihre Größe mit ArrayResize. Und es ist global sichtbar, und OnInit ist freigegeben...

Nicht ganz richtig, das Array ist statisch mit klar definierten Werten, es macht keinen Sinn, es separat zu initialisieren(
 
Money_Maker:

um zu verhindern, dass OnInit bei jeder Neuinitialisierung durchdreht und um das statische Array auf eine Instanz zu reduzieren, da es an einigen Stellen doppelt geschrieben wird... im Allgemeinen ist dies eine Ressourcenoptimierung
... Ich werde es so lassen, wie es jetzt ist.
Um eine Schleife in OnOnit() bei jeder Neuinitialisierung zu vermeiden, überprüfen Sie einfach den Grund für die Deinitialisierung UninitializeReason(), und ich bekomme nichts weiter. Was bedeutet es, ein statisches Feld zu reduzieren? Nun, im Allgemeinen wissen Sie es besser.
 
Werden die Provisionen im MT4-Tester nicht berücksichtigt?
 
Andrey Dik:
Werden die Provisionen im MT4-Tester nicht berücksichtigt?
Offenbar muss man mit einem Konto verbunden sein, für das eine Provision gezahlt wird, damit diese berücksichtigt werden kann.
 

Frage zu der Funktion Print(); wie kann man Print() dazu bringen, die Daten plus das Datum (Tag) im EA zu drucken? Helfen Sie einem Anfänger, die plz zu verstehen, setzen Sie den Code neu gemacht für die Zwecke des Experiments, induke "pivot" vorher cbs!


den Code selbst: PivotsDaily v2.mq4


#property indicator_chart_window

#Eigenschaft indicator_buffers 3

#Eigenschaft indicator_color1 Lime

#Eigenschaft indicator_color2 Blau

#property indicator_color3 Rot


//---- Eingabeparameter

extern inttern CountBars=300;

//---- Puffer

double PBuffer[];

double S1Buffer[];

double R1Puffer[];


string Pivot="P", Sup1="S 1", Res1="R 1";


int fontsize=10;

double P,S1,R1,S2,R2,S3,R3;

double LastHigh,LastLow,x;

//+------------------------------------------------------------------+

//| Funktion zur Deinitialisierung des Custor-Indikators |

//+------------------------------------------------------------------+

int deinit()

{


ObjectDelete("Pivot");

ObjectDelete("S1");

ObjectDelete("R1");

zurück(0);

}

//+------------------------------------------------------------------+

//| Benutzerdefinierte Initialisierungsfunktion für Indikatoren |

//+------------------------------------------------------------------+

int init()

{

string kurz_name;


IndikatorPuffer(7);

//---- Indikatorzeile

SetIndexStyle(0,DRAW_ARROW,2,1,Lime);

SetIndexPfeil(0,158);

SetIndexStyle(1,DRAW_ARROW,2,1,Blue);

SetIndexPfeil(1,158);

SetIndexStyle(2,DRAW_ARROW,2,1,Red);

SetIndexPfeil(2,158);


SetIndexPuffer(0,PBuffer);

SetIndexPuffer(1,S1Puffer);

SetIndexBuffer(2,R1Buffer);


//---- Name für das Datenfenster und die Bezeichnung des Unterfensters des Indikators

short_name="Pivot";

IndicatorShortName(short_name);

SetIndexLabel(0,short_name);

short_name="R1";

IndicatorShortName(short_name);

SetIndexLabel(2,short_name);


short_name="S1";

IndicatorShortName(short_name);

SetIndexLabel(1,short_name);


SetIndexDrawBegin(0,6);

//----


zurück(0);

}

//+------------------------------------------------------------------+

//| Benutzerdefinierte Indikator-Iterationsfunktion |

//+------------------------------------------------------------------+

int start()


{

int counted_bars=IndicatorCounted();


int Grenze, i;

//---- Indikatorberechnung

if (gezählte_Balken==0)

{

x=Periode();

if (x>CountBars) return(-1);

ObjectCreate("Pivot", OBJ_TEXT, 0, 0,0);

ObjectSetText("Pivot", " Pivot",10, "Arial",Lime);

ObjectCreate("S1", OBJ_TEXT, 0, 0, 0);

ObjectSetText("S1", " S1",10, "Arial",Blue);

ObjectCreate("R1", OBJ_TEXT, 0, 0, 0);

ObjectSetText("R1", " R1",10, "Arial",Red);

}

if(counted_bars<0) return(-1);


limit=(Balken-gezählte_Balken)-1;


for (i=limit; i>=0;i--)

{

if (TimeDayOfWeek(Time[i]) != 0)

{

if (High[i+1]>LastHigh) LastHigh=High[i+1];

if (Low[i+1]<LastLow) LastLow=Low[i+1];

}


wenn (

TimeDay(Time[i])!=TimeDay(Time[i+1]) && TimeDayOfWeek(Time[i])!=0

)

{

P=Schließen[i+1];

R1 = LastLow;

S1 = LastHigh;

S2=High[i]-Low[i];

S3=High[i]-Open[i+1];

if(S3==0)

{R2 = S3;} sonst {R2 = S2/S3;}

Print("R2 ",R2); // <= Wie bekomme ich den Drucker plus die Daten dazu, das Datum zu drucken?


LastLow=Open[i]; LastHigh=Open[i];

ObjectMove("Pivot", 0, Time[i],P);

ObjectMove("S1", 0, Time[i],S1);

ObjectMove("R1", 0, Time[i],R1);

}

PBuffer[i]=P;

S1Puffer[i]=S1;

R1Puffer[i]=R1;

}

//----

zurück(0);

}

Grund der Beschwerde: