Vous manquez des opportunités de trading :
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Inscription
Se connecter
Vous acceptez la politique du site Web et les conditions d'utilisation
Si vous n'avez pas de compte, veuillez vous inscrire
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....
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);
}
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
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.
deeVous devrez diviser le tableau en plusieurs tableaux ou écrire une boucle pour extraire le maximum du tableau, par exemple :
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.
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
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
Merci encore !
J'ai changé la 3ème ligne de la dernière ligne en ceci
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 !!!!
deePour 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.