Demandez ! - page 34

 
AnasFX:
Ok, ça a marché, mais maintenant le problème est la performance. Vérifier l'historique complet prend du temps. J'ai fait un backtest sur une période d'un an et demi et j'ai remarqué que c'était lent. La raison est que je vérifie tous les ordres dans l'historique et que je compare leur prix de clôture et leur heure de clôture. Existe-t-il un moyen de limiter la recherche dans l'historique pour qu'elle ne porte que sur les ordres récents ? Puis-je améliorer les performances de toute façon ?

vous pouvez essayer

OrderSelect(HistoryTotal(),SELECT_BY_POS,MODE_HISTORY) ;

mais je ne suis pas sûr pour celui-ci, je pense qu'il prendra la dernière commande dans tout l'historique.

merci

 

Bonjour à tous...

quelqu'un peut-il m'aider...

j'ai un indicateur pour créer EA....

 
phoenix:
vous pouvez essayer

OrderSelect(HistoryTotal(),SELECT_BY_POS,MODE_HISTORY) ;

mais je ne suis pas sûr pour celui-ci, je pense qu'il prendra la dernière commande de tout l'historique.

salutations

édité de ma faute...il faut que ce soit

OrderSelect(HistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY) ;

 

Désolé de poster deux fois, mais j'ai vraiment besoin d'aide...

Je suis désespéré. J'ai essayé toute la nuit de faire fonctionner mon tableau mais rien ne se passe. J'ai vraiment essayé d'être autonome et d'apprendre mais je n'arrive toujours pas à me rendre là où je dois aller. Si quelqu'un pouvait avoir pitié de moi et me prêter main forte....PLEASE !!!!!

J'utilise un script de grille mais j'aimerais savoir combien de lots je fais fonctionner par symbole. Je veux être capable d'additionner ce que ma position totale est par taille de lot. Disons que j'ai 0,10, 0,10, 0,10, 0,10, 0,20, 0,30, je veux pouvoir savoir que j'ai l'équivalent de 0,90 lot. J'aimerais également connaître les tailles de lot minimale et maximale....0.10 et 0.30.

ArrayResize(OrderArray, i);

ArrayInitialize(OrderArray,0);

cnt = 0;

for (i = 0; i < OrdersTotal(); i++)

{

if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES) && OrderSymbol() == Symbol() )

{

OrderArray[cnt][PROFIT] = OrderProfit() + OrderSwap();

OrderArray[cnt][OPEN] = OrderOpenPrice();

OrderArray[cnt][LOTS] = OrderLots();

if(OrderType() == OP_BUY)

{

////// I can't get anything to work!!!!!!!

BuyLots += OrderArray[cnt][LOTS];

////// This returns Zero when I place BuyLots in my Comments

////// This returns error messages

MaxBuyLots =ArrayMaximum(OrderArray[LOTS],WHOLE_ARRAY,0);

}

 
deeforex:
Désolé pour le double affichage mais j'ai vraiment besoin d'aide...

Je suis désespéré. J'ai essayé toute la nuit de faire fonctionner mon tableau mais rien ne se passe. J'ai vraiment essayé d'être autonome et d'apprendre, mais je n'arrive toujours pas à me rendre là où je dois aller. Si quelqu'un pouvait avoir pitié de moi et me prêter main forte....PLEASE !!!!!

J'utilise un script de grille mais j'aimerais savoir combien de lots je fais fonctionner par symbole. Je veux être capable d'additionner ce que ma position totale est par taille de lot. Disons que j'ai 0,10, 0,10, 0,10, 0,10, 0,20, 0,30, je veux pouvoir savoir que j'ai l'équivalent de 0,90 lot. J'aimerais également connaître la taille minimale et maximale des lots : ....0.10 et 0.30.

Le problème est que la fonction arrayresize() ne redimensionne que le premier élément, pas le second. De toute évidence, vos macros LOTS, PROFIT et OPEN doivent être respectivement 0, 1 et 2. De plus, l'objet de comptage dans la boucle for est (i) alors que le code du bloc se réfère à (cnt). Essayez ceci et voyez si cela fonctionne.

double OrderArray[][3];

ArrayResize( OrderArray, OrdersTotal() );

cnt = 0;

for (cnt = 0; cnt< OrdersTotal(); cnt++)

{

if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES) && OrderSymbol() == Symbol() )

{

OrderArray[cnt][PROFIT] = OrderProfit() + OrderSwap();

OrderArray[cnt][OPEN] = OrderOpenPrice();

OrderArray[cnt][LOTS] = OrderLots();

if(OrderType() == OP_BUY)

{

double BuyLots;

BuyLots += OrderArray[cnt][LOTS];

MaxBuyLots =ArrayMaximum(OrderArray);

}

 

Merci Nicholishen,

Je m'approche un peu plus. BuyLots renvoie ce que je veux mais ArrayMaximum me donne un nombre étrange que je n'arrive pas à comprendre. Il ne renvoie pas la plus grande taille de lot.

J'apprécie vraiment votre aide.

dee

 
deeforex:
Merci Nicholishen,

Je m'approche un peu plus. BuyLots renvoie ce que je veux, mais ArrayMaximum me donne un nombre étrange que je n'arrive pas à comprendre. Il ne renvoie pas la taille de lot la plus élevée.

J'apprécie vraiment votre aide.

dee

Vous devrez diviser le tableau en plusieurs tableaux ou écrire une boucle pour extraire le maximum du tableau, par exemple :

double OrderArray...[];

ArrayResize( OrderArray, OrdersTotal() );

cnt = 0;

for (cnt = 0; cnt< OrdersTotal(); cnt++)

{

if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES) && OrderSymbol() == Symbol() )

{

OrderArrayProfit[cnt] = OrderProfit() + OrderSwap();

OrderArrayOpen[cnt] = OrderOpenPrice();

OrderArrayLots[cnt] = OrderLots();

if(OrderType() == OP_BUY)

{

double BuyLots;

BuyLots += OrderArrayLots[cnt];

MaxBuyLots =ArrayMaximum(OrderArrayLots);

}

[/CODE]

or

[CODE]double OrderArray[][3];

ArrayResize( OrderArray, OrdersTotal() );

cnt = 0;

for (cnt = 0; cnt< OrdersTotal(); cnt++)

{

if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES) && OrderSymbol() == Symbol() )

{

OrderArray[cnt][PROFIT] = OrderProfit() + OrderSwap();

OrderArray[cnt][OPEN] = OrderOpenPrice();

OrderArray[cnt][LOTS] = OrderLots();

if(OrderType() == OP_BUY)

{

double BuyLots;

BuyLots += OrderArray[cnt][LOTS];

}

double MBL;

for(int i=0;i<OrdersTotal();i++){

if(OrderArrayLots[LOTS]>MBL)MBL=OrderArrayLots[LOTS];

}

MaxBuyLots =MBL;

 

Voici un autre exemple de fonction qui permet de suivre les stops suiveurs serrés sur plusieurs transactions dans la même devise en associant les données de suivi au numéro de ticket de la transaction correspondante - en utilisant des tableaux. Peut-être cela vous aidera-t-il à trouver des idées.

int tsTicket[21];

double tsPrice[21];

bool tsok[21];

int tkt3[20];

int SuperClose(){// superclose by nicholishen

int cnp=ordercnt();

for(int i=0;i<cnp;i++){

if(OrderMatch(i)){

if(0==0){//Pulls in order that meets the criteria for processing

int num=0;int pos=0;

for(int b=0;b<21;b++){// this (loopB) compares the ticket# of the selected order against the number stored in the ticket array

if(tsTicket==OrderTicket() ){

num++; pos=b;// if ticket numbers match, pos is the position in the array where the trailing data is stored

break;

}

}

if(num==0){ // if the loopB did not find a matching ticket number it is time to initialize the data

for(int j=0;j<21;j++){

if(tsTicket[j]==0){// this is looking for the earliest instance within the array to store the data

pos=j;

break;

}

}

tsTicket[pos]=OrderTicket();// setting the ticket number

tsok[pos]=false;// this is to determine when trailing kicks in

// Print("(",pos,") New ticket initialized = ",tsTicket[pos]);

}

if (OrderType()==OP_SELL) {

if (!tsok[pos] && (OrderOpenPrice()-Ask>=TSactivation*Point || TSactivation==0 ) ) {// if the trailing factor is false, but it has hit the activation point continue

tsPrice[pos]=Ask+TrailPips*Point;// this is the new trailinf stop price

tsok[pos]=true;// it's ok to proceed with trailing stop

if(TrailPips>8){// if this distance from the current price to the new stop, then modify the order.

ModifyStopLoss(Ask+TrailPips*Point,OrderTakeProfit());//modifies order

}

}

if (tsok[pos] && Ask+TrailPips*Point < tsPrice[pos] ){//if the position is gaining in profit

tsPrice[pos]=Ask+TrailPips*Point;

if(TrailPips>8){

ModifyStopLoss(Ask+TrailPips*Point,OrderTakeProfit());

}

}

if (tsok[pos] && Ask >= tsPrice[pos] ){// if the postion hits the stop price

if(CloseOrder(Ask)==STOP)return(STOP);

Print("Short Order ",tsTicket[pos]," Closed from TS");

}

}

else if (OrderType()==OP_BUY) {// reverse of SELL

if(!tsok[pos] && (Bid-OrderOpenPrice() >= TSactivation*Point || TSactivation==0 ) ) {

tsPrice[pos]=Bid-TrailPips*Point;

tsok[pos]=true;

if(TrailPips>8){

ModifyStopLoss(Bid-TrailPips*Point,OrderTakeProfit());

}

}

if (tsok[pos] && Bid-TrailPips*Point > tsPrice[pos] ){

tsPrice[pos]=Bid-TrailPips*Point;

if(TrailPips > 8){

ModifyStopLoss(Bid-TrailPips*Point,OrderTakeProfit());

}

}

if (tsok[pos] && Bid <= tsPrice[pos] ){

if(CloseOrder(Bid)==STOP)return(STOP);

Print("Long Order ",tsTicket[pos]," Closed from TS");

}

}

}

}

if(RefreshRates())return(STOP);

}

for(i=0;i<21;i++){// this searches the array for ticket numbers that are now obsolete due to an order that has closed

if(tsTicket>0){

bool found=false;

for(b=0;b<OrdersTotal();b++){

OrderSelect(b,SELECT_BY_POS);

if(tsTicket==OrderTicket()){

found=true;

break;

}

}

if(!found){// if there are matching ticket numbers in the trade pool and the array then nothing happens

tsTicket=0;tsPrice=0;tsok=false;// if there is an obolete ticket the the data is reset. And the next new ticket data can occupy this space

// Print("Array pos ",i," Cleaned");

}

}

}

return(0);

}

int ordercnt(){

int c;

for(int i=0;i<OrdersTotal();i++){

if(OrderSelect(i,SELECT_BY_POS)){

if(OrderMagicNumber()==ID && OrderSymbol()==Symbol()){

tkt3[c]=OrderTicket();

c++;

}

}

}

return(c);

}

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

int curcnt(){

int c;

for(int i=0;i<OrdersTotal();i++){

if(OrderSelect(i,SELECT_BY_POS)){

if(OrderSymbol()==Symbol()){

c++;

return(c);

}

}

}

return(c);

}

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

bool OrderMatch(int i){

if(OrderSelect(tkt3,SELECT_BY_TICKET)){

if(OrderMagicNumber()==ID && OrderSymbol()==Symbol()){

return(true);

}

}

return(false);

}
 

Merci encore !

J'ai changé la 3ème ligne de la dernière ligne en ceci

if(OrderArray[LOTS]>MBL)MBL=OrderArray[LOTS];

et ça a marché. L'heure du coucher est passée. Demain, à mon réveil, j'étudierai la logique de votre code. Mais comme je suis têtu, je vais trouver comment utiliser la fonction ArrayMaximum! Je vais aussi devoir lire davantage sur l'indexation pour voir comment mes anciennes méthodes étaient si erronées.

Encore merci !!!!

dee

 
deeforex:
Merci encore !

J'ai changé la 3ème ligne de la dernière ligne en ceci

if(OrderArray[LOTS]>MBL)MBL=OrderArray[LOTS];

et ça a marché. L'heure du coucher est passée. Demain, à mon réveil, j'étudierai la logique de votre code. Mais comme je suis têtu, je vais trouver comment utiliser la fonction ArrayMaximum ! Je vais aussi devoir lire davantage sur l'indexation pour voir comment mes anciennes méthodes étaient si erronées.

Encore une fois, merci !!!!

dee

Pour vous faire gagner du temps, la raison pour laquelle la fonction max ne fonctionne pas pour ce que vous voulez est que vous utilisez un tableau multidimensionnel et que vous stockez différents types de données. Elle renvoie le maximum de ces données, il est donc probable que vous renvoyiez un nombre de bénéfices ou quelque chose de plus élevé que votre taille de lot maximale réelle.

Raison: