Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 182

 
Artyom Trishkin:
Et vous n'avez pas montré un seul morceau de votre code - la raison pour laquelle vous montrez un exemple n'est pas claire.

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(){

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

}

Lorsque l'EA travaille pendant une longue période, le tableau devient trop grand pour le traitement et nous devons le réduire. Tous les anciens ordres fermés sont au début et tout ce qui suit le premier ordre ouvert trouvé doit être laissé.
 
Evgenii:

...
Lorsque l'EA fonctionne depuis longtemps, le tableau devient trop grand pour être traité et nous devons le réduire. Tous les anciens ordres fermés sont au début, tout ce qui suit le premier ordre ouvert trouvé doit être laissé.

Qu'arrive-t-il au tableau de structures lorsque l'EA est redémarré ?

 
Artyom Trishkin:

Qu'arrive-t-il au tableau de structure lorsque l'EA est redémarré ?

le tableau se bloque, ce problème n'a pas été résolu.
 
Evgenii:
Le tableau sera supprimé, ce problème n'a pas été résolu.

Voilà. Et cela aurait dû être envisagé dès le départ.

La conclusion est évidente : le tableau doit être mis à zéro et rempli à nouveau avec l'état actuel des ordres et des positions. Mais cela ne doit être fait que lorsque vous constatez des changements dans le nombre d'ordres ou de positions sur le compte.

Vous n'aurez toujours sous la main que l'état actuel des ordres et des positions, et il ne sera pas nécessaire de se préoccuper d'éliminer les ordres/positions inexistants du tableau. Et la liste des ordres/positions devra être parcourue complètement, ou pour une période donnée de l'historique, mais seulement dans des cas spécifiques - lorsque le nombre d'ordres/positions dans le compte change.

 
Alexey Viktorov:
Pourquoi avez-vous besoin d'une telle perversion ?

Pour que onInit ne tourne pas à chaque réinitialisation et réduise le tableau statique en une seule instance parce qu'à certains endroits il est écrit deux fois... en général, c'est une optimisation des ressources
... Je vais le laisser tel quel, c'est plus simple pour l'instant.
 
LRA:
Vous déclarez un tableau global sans spécifier de taille. Votre fonction définit sa taille par ArrayResize. Et c'est visible globalement, et OnInit est libéré...

Pas tout à fait juste, le tableau est statique avec des valeurs clairement définies, cela n'a pas de sens de l'initialiser séparément(
 
Money_Maker:

pour éviter que OnInit ne tourne à chaque réinitialisation et pour réduire le tableau statique à une seule instance car à certains endroits, il est écrit deux fois... en général, c'est une optimisation des ressources.
... je vais laisser les choses telles qu'elles sont maintenant.
Pour éviter de boucler dans OnOnit() à chaque réinitialisation, il suffit de vérifier la raison de la désinitialisation UninitializeReason(), et je n'obtiens rien de plus. Qu'est-ce que cela signifie de réduire un tableau statique ? Eh bien, en général, vous le savez mieux que quiconque.
 
Les commissions ne sont-elles pas prises en compte dans le testeur MT4 ?
 
Andrey Dik:
Les commissions ne sont-elles pas prises en compte dans le testeur MT4 ?
Il semble que vous deviez être connecté à un compte avec une commission pour qu'elle soit prise en compte.
 

Question sur la fonction Print(); comment faire pour que Print() imprime les données plus la date (jour) dans l'EA ? aider un débutant à comprendre le plz, mettre le code refait pour le bien de l'expérience, induire "pivot" avant cbs !


le code lui-même : PivotsDaily v2.mq4


#property indicator_chart_window

#property indicator_buffers 3

#propriété indicator_color1 Lime

#property indicator_color2 Blue

#property indicator_color3 Red


//---- paramètres d'entrée

extern inttern CountBars=300 ;

//---- tampons

double PBuffer[] ;

double S1Buffer[] ;

double R1Buffer[] ;


chaîne Pivot="P", Sup1="S 1", Res1="R 1" ;


int fontsize=10 ;

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

double LastHigh,LastLow,x ;

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

//| Fonction de désinitialisation de l'indicateur de dépôt |

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

int deinit()

{


ObjectDelete("Pivot") ;

ObjectDelete("S1") ;

ObjectDelete("R1") ;

retour(0) ;

}

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

//| Fonction d'initialisation de l'indicateur personnalisé |

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

int init()

{

string short_name ;


IndicatorBuffers(7) ;

//---- ligne d'indicateurs

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

SetIndexArrow(0,158) ;

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

SetIndexArrow(1,158) ;

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

SetIndexArrow(2,158) ;


SetIndexBuffer(0,PBuffer) ;

SetIndexBuffer(1,S1Buffer) ;

SetIndexBuffer(2,R1Buffer) ;


//---- nom pour la DataWindow et l'étiquette de la sous-fenêtre de l'indicateur

short_name="Pivot" ;

IndicatorShortName(nom_court) ;

SetIndexLabel(0,short_name) ;

short_name="R1" ;

IndicatorShortName(nom_court) ;

SetIndexLabel(2,nom_court) ;


short_name="S1" ;

IndicatorShortName(nom_court) ;

SetIndexLabel(1,nom_court) ;


SetIndexDrawBegin(0,6) ;

//----


retour(0) ;

}

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

//| Fonction d'itération de l'indicateur personnalisé |

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

int start()


{

int counted_bars=IndicatorCounted() ;


int limite, i ;

//---- calcul de l'indicateur

si (counted_bars==0)

{

x=Période() ;

si (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) ;

}

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


limit=(Bars-counted_bars)-1 ;


pour (i=limite ; i>=0;i--)

{

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

{

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

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

}


si (

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

)

{

P=Close[i+1] ;

R1 = LastLow ;

S1 = LastHigh ;

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

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

si(S3==0)

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

Print("R2 ",R2) ; // <= comment faire pour que l'imprimante plus les données impriment la date ?


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 ;

S1Buffer[i]=S1 ;

R1Buffer[i]=R1 ;

}

//----

retour(0) ;

}