Aide au codage - page 259

 

J'essaie de réaliser le back testing tick par tick d'un graphique personnalisé. Comme je n'ai aucune expérience en la matière, quelqu'un pourrait probablement me donner un coup de main pour avancer. Car apparemment, je fais quelque chose de mal.

Je lis des cotations à partir d'un fichier CSV et les stocke dans des fichiers FXT et HST.

Ensuite, je marque le fichier FXT en lecture seule. Le problème est que le testeur de stratégie n'accepte jamais mon fichier FXT et s'arrête.

Ce que je ne sais pas, c'est dans quelle mesure les fichiers FXT et HST doivent être cohérents. Ce que je veux dire, c'est que, par exemple, le graphique des barres de distance présente un écart uniforme de 1 point dans le fichier HST, alors qu'il présente un écart modéré dans le fichier FXT. Cela peut-il être un problème ?

Dossiers :
clipboard72.png  19 kb
 
Ovo:
J'essaie de réaliser le back testing tick par tick d'un graphique personnalisé. Comme je n'ai aucune expérience en la matière, quelqu'un pourrait probablement me donner un coup de main pour avancer. Car apparemment, je fais quelque chose de mal.

Je lis des devis à partir d'un fichier CSV et je les stocke dans des fichiers FXT et HST.

Ensuite, je marque le fichier FXT en lecture seule. Le problème est que le testeur de stratégie n'accepte jamais mon fichier FXT et s'arrête.

Ce que je ne sais pas, c'est dans quelle mesure les fichiers FXT et HST doivent être cohérents. Ce que je veux dire, c'est que, par exemple, le graphique des barres de distance présente un écart uniforme de 1 point dans le fichier HST, alors qu'il présente un écart modéré dans le fichier FXT. Cela peut-il être un problème ?

Ovo

Cela ne devrait pas être un problème du tout (des écarts beaucoup plus importants que ces 1 points sont créés dans le fichier fxt lorsque vous effectuez un back test). Le format du fichier fxt est-il approprié (nouveau) ?

 
mladen:
Ovo Cela ne devrait pas être un problème du tout (des écarts beaucoup plus importants que ces 1 points sont faits dans le fichier fxt lorsque vous faites un back test). Le format du fichier fxt est-il approprié (nouveau) ?

Merci, j'espérais que ce n'était pas un problème.

Je ne suis pas tout à fait sûr du format réel du FXT, mais celui que j'ai rend des bougies.

J'ai d'abord trouvé la version 401 sur le site de MQL4, ce qui m'a aidé à faire de la rétro-ingénierie sur la 405, puis j'ai trouvé le script CSV2FXT avec la version 405 à l'intérieur, mais je ne l'ai pas encore complètement analysé.

Je pense que le bug se trouve plutôt dans le contenu de l'en-tête, auquel je n'ai pas prêté beaucoup d'attention.

Je devrais donc maintenant me concentrer sur l'en-tête du FXT plutôt que sur la forme de la bougie (dont le rendu est tout à fait approprié).

J'utilise actuellement cette structure pour le FXT :

struct Shortdate {

int date;

};

struct Padding {

char padding;

};

struct MT4FxtCandle {

datetime openTime;

double open;

double high;

double low;

double close;

uint volume;

uint spread;

Shortdate tickTime;

int flag;

};

struct MT4FxtHeader {

int version;

char copyright[64];

char server[128];

char symbol[12];

int period;

TestModelEnum model;

int bars;

Shortdate fromdate;

Shortdate todate;

Padding p1[4];

double modelquality;

char currency[12];

int spread;

int digits;

Padding p2[4];

double point;

int lot_min;

int lot_max;

int lot_step;

int stops_level;

int gtc_pendings;

Padding p3[4];

double contract_size;

double tick_value;

double tick_size;

ProfitCalcModeEnum profit_mode;

int swap_enable;

int swap_type;

Padding p4[4];

double swap_long;

double swap_short;

int swap_rollover3days;

int leverage;

FreeMarginCalcModeEnum free_margin_mode;

MarginCalcModeEnum margin_mode;

int margin_stopout;

ENUM_ACCOUNT_STOPOUT_MODE margin_stopout_mode;

double margin_initial;

double margin_maintenance;

double margin_hedged;

double margin_divider;

char margin_currency[12];

Padding p5[4];

double comm_base;

int comm_type;

int comm_lots;

int from_bar;

int to_bar;

int start_period[6];

int from;

int to;

int freeze_level;

int reserved[61];

};

 
Ovo:
Merci, j'espérais que ce n'était pas un problème.

Je ne suis pas tout à fait sûr du format réel du FXT, mais celui que j'ai rend des bougies.

J'ai d'abord trouvé la version 401 sur le site MQL4, ce qui m'a aidé à faire de la rétro-ingénierie sur la 405, puis j'ai trouvé le script CSV2FXT avec la version 405 à l'intérieur, mais je ne l'ai pas encore complètement analysé.

Je pense que le bug se trouve plutôt dans le contenu de l'en-tête, auquel je n'ai pas prêté beaucoup d'attention.

Je devrais donc maintenant me concentrer sur l'en-tête du FXT plutôt que sur la forme de la bougie (dont le rendu est tout à fait approprié).

J'utilise actuellement cette structure pour le FXT :

struct Shortdate {

int date;

};

struct Padding {

char padding;

};

struct MT4FxtCandle {

datetime openTime;

double open;

double high;

double low;

double close;

uint volume;

uint spread;

Shortdate tickTime;

int flag;

};

struct MT4FxtHeader {

int version;

char copyright[64];

char server[128];

char symbol[12];

int period;

TestModelEnum model;

int bars;

Shortdate fromdate;

Shortdate todate;

Padding p1[4];

double modelquality;

char currency[12];

int spread;

int digits;

Padding p2[4];

double point;

int lot_min;

int lot_max;

int lot_step;

int stops_level;

int gtc_pendings;

Padding p3[4];

double contract_size;

double tick_value;

double tick_size;

ProfitCalcModeEnum profit_mode;

int swap_enable;

int swap_type;

Padding p4[4];

double swap_long;

double swap_short;

int swap_rollover3days;

int leverage;

FreeMarginCalcModeEnum free_margin_mode;

MarginCalcModeEnum margin_mode;

int margin_stopout;

ENUM_ACCOUNT_STOPOUT_MODE margin_stopout_mode;

double margin_initial;

double margin_maintenance;

double margin_hedged;

double margin_divider;

char margin_currency[12];

Padding p5[4];

double comm_base;

int comm_type;

int comm_lots;

int from_bar;

int to_bar;

int start_period[6];

int from;

int to;

int freeze_level;

int reserved[61];

};

Je vais essayer de trouver d'autres informations

Certains détails sur les en-têtes des fichiers hst et fxt n'ont jamais été publiés, donc je ne suis pas sûr que nous puissions déchiffrer le format de l'en-tête à 100%.

 

Bonjour, je n'utilise pas de chiffres ronds mais des chiffres spéciaux qui me sont propres et je voudrais les REMPLACER sur l'indy ci-joint. Mes chiffres sont 5, 15, 31, 45 et 67. Dans l'attente de votre réponse

Dossiers :
 

OrderModify Erreur1

Bonjour à tous,

Je me demande si quelqu'un pourrait m'aider. Je ne reçois pas d'erreur de compilation, mais lors de

que je teste, je reçois un "OrderModify Error1" de MT4. Que pourrais-je faire de mieux

dans mon code ci-dessous ?

bool ModifyOrder(int nOrderType,int ord_ticket,double op,double price,double tp,color mColor=CLR_NONE)

{

int cnt,err;

double myStop;

myStop=ValidStopLoss(nOrderType,price);

cnt=0;

while(cnt<totalTries)

{

if(OrderModify(ord_ticket,op,myStop,tp,0,mColor))

{

return(true);

}

else

{

err=GetLastError();

if(err>1) Print(cnt," Error modifying order : (",ord_ticket,") "+ErrorDescription(err)," err ",err);

if(err>0) cnt++;

Sleep(retryDelay);

}

}

return(false);

}

[/CODE]

void OpenBuyOrder()

{

int ticket;

int err,digits;

double myStopLoss=0,myTakeProfit=0,myPrice=0;

myPrice=MarketInfo(Symbol(),MODE_ASK);

myStopLoss=0;

if(StopLoss>0) myStopLoss=myPrice-StopLoss*point;

if(myStopLoss!=0) ValidStopLoss(OP_BUY,myStopLoss);

myTakeProfit=0;

if(UseTakeProfit && TakeProfit>0) myTakeProfit=myPrice+TakeProfit*point;

// Normalize all price / stoploss / takeprofit to the proper # of digits.

digits=MarketInfo(Symbol(),MODE_DIGITS);

if(digits>0)

{

myPrice=NormalizeDouble(myPrice,digits);

myStopLoss=NormalizeDouble(myStopLoss,digits);

myTakeProfit=NormalizeDouble(myTakeProfit,digits);

}

ticket=OrderSend(Symbol(),OP_BUY,lotMM,myPrice,Slippage,myStopLoss,myTakeProfit,setup,MagicNumber,0,LimeGreen);

if(ticket>0 && ModifyOrder(OP_BUY,ticket,OrderOpenPrice(),myStopLoss,myTakeProfit,CLR_NONE))

{

if(Debug) Print("BUY order opened : ",OrderOpenPrice());

}

else

{

err=GetLastError();

Print("Error opening BUY order : ("+err+") "+ErrorDescription(err));

}

}

[/CODE]

[CODE]

void OpenSellOrder()

{

int ticket;

int err,digits;

double myStopLoss=0,myTakeProfit=0,myPrice=0;

myPrice=MarketInfo(Symbol(),MODE_BID);

myStopLoss=0;

if(StopLoss>0) myStopLoss=myPrice+StopLoss*point;

if(myStopLoss!=0) ValidStopLoss(OP_SELL,myStopLoss);

myTakeProfit=0;

if(UseTakeProfit && TakeProfit>0) myTakeProfit=myPrice-TakeProfit*point;

// Normalize all price / stoploss / takeprofit to the proper # of digits.

digits=MarketInfo(Symbol(),MODE_DIGITS);

if(digits>0)

{

myPrice=NormalizeDouble(myPrice,digits);

myStopLoss=NormalizeDouble(myStopLoss,digits);

myTakeProfit=NormalizeDouble(myTakeProfit,digits);

}

ticket=OrderSend(Symbol(),OP_SELL,lotMM,myPrice,Slippage,myStopLoss,myTakeProfit,setup,MagicNumber,0,Red);

if(ticket>0 && ModifyOrder(OP_SELL,ticket,OrderOpenPrice(),myStopLoss,myTakeProfit,CLR_NONE))

{

if(Debug) Print("SELL order opened : ",OrderOpenPrice());

}

else

{

err=GetLastError();

Print("Error opening SELL order : ("+err+") "+ErrorDescription(err));

}

return(0);

}

[CODE]

int HandleTrailingStop(int type,int ticket,double op,double os,double tp)

{

double pt,TS=0,myAsk,myBid;

switch(type)

{

case OP_BUY:

{

myBid=MarketInfo(Symbol(),MODE_BID);

switch(TrailingStopType)

{

case 1: pt=point*StopLoss;

if(myBid-os>pt)

ModifyOrder(type,ticket,op,myBid-pt,tp,Aqua);

break;

case 2: pt=point*TrailingStop;

if(myBid-op>pt && os<myBid-pt)

ModifyOrder(type,ticket,op,myBid-pt,tp,Aqua);

break;

}

return(0);

break;

}

case OP_SELL:

{

myAsk=MarketInfo(Symbol(),MODE_ASK);

switch(TrailingStopType)

{

case 1: pt=point*StopLoss;

if(os-myAsk>pt)

ModifyOrder(type,ticket,op,myAsk+pt,tp,Aqua);

break;

case 2: pt=point*TrailingStop;

if(op-myAsk>pt && os>myAsk+pt)

ModifyOrder(type,ticket,op,myAsk+pt,tp,Aqua);

break;

}

}

return(0);

}

}

Merci d'avance !

 
tfi_markets:
OrderModify Erreur1

Bonjour à tous,

Je me demande si quelqu'un pourrait m'aider. Je ne reçois pas d'erreur de compilation, mais en

que je teste, je reçois un "OrderModify Error1" de MT4. Que pourrais-je faire de mieux

dans mon code ci-dessous ?

bool ModifyOrder(int nOrderType,int ord_ticket,double op,double price,double tp,color mColor=CLR_NONE)

{

int cnt,err;

double myStop;

myStop=ValidStopLoss(nOrderType,price);

cnt=0;

while(cnt<totalTries)

{

if(OrderModify(ord_ticket,op,myStop,tp,0,mColor))

{

return(true);

}

else

{

err=GetLastError();

if(err>1) Print(cnt," Error modifying order : (",ord_ticket,") "+ErrorDescription(err)," err ",err);

if(err>0) cnt++;

Sleep(retryDelay);

}

}

return(false);

}

[/CODE]

void OpenBuyOrder()

{

int ticket;

int err,digits;

double myStopLoss=0,myTakeProfit=0,myPrice=0;

myPrice=MarketInfo(Symbol(),MODE_ASK);

myStopLoss=0;

if(StopLoss>0) myStopLoss=myPrice-StopLoss*point;

if(myStopLoss!=0) ValidStopLoss(OP_BUY,myStopLoss);

myTakeProfit=0;

if(UseTakeProfit && TakeProfit>0) myTakeProfit=myPrice+TakeProfit*point;

// Normalize all price / stoploss / takeprofit to the proper # of digits.

digits=MarketInfo(Symbol(),MODE_DIGITS);

if(digits>0)

{

myPrice=NormalizeDouble(myPrice,digits);

myStopLoss=NormalizeDouble(myStopLoss,digits);

myTakeProfit=NormalizeDouble(myTakeProfit,digits);

}

ticket=OrderSend(Symbol(),OP_BUY,lotMM,myPrice,Slippage,myStopLoss,myTakeProfit,setup,MagicNumber,0,LimeGreen);

if(ticket>0 && ModifyOrder(OP_BUY,ticket,OrderOpenPrice(),myStopLoss,myTakeProfit,CLR_NONE))

{

if(Debug) Print("BUY order opened : ",OrderOpenPrice());

}

else

{

err=GetLastError();

Print("Error opening BUY order : ("+err+") "+ErrorDescription(err));

}

}

[/CODE]

[CODE]

void OpenSellOrder()

{

int ticket;

int err,digits;

double myStopLoss=0,myTakeProfit=0,myPrice=0;

myPrice=MarketInfo(Symbol(),MODE_BID);

myStopLoss=0;

if(StopLoss>0) myStopLoss=myPrice+StopLoss*point;

if(myStopLoss!=0) ValidStopLoss(OP_SELL,myStopLoss);

myTakeProfit=0;

if(UseTakeProfit && TakeProfit>0) myTakeProfit=myPrice-TakeProfit*point;

// Normalize all price / stoploss / takeprofit to the proper # of digits.

digits=MarketInfo(Symbol(),MODE_DIGITS);

if(digits>0)

{

myPrice=NormalizeDouble(myPrice,digits);

myStopLoss=NormalizeDouble(myStopLoss,digits);

myTakeProfit=NormalizeDouble(myTakeProfit,digits);

}

ticket=OrderSend(Symbol(),OP_SELL,lotMM,myPrice,Slippage,myStopLoss,myTakeProfit,setup,MagicNumber,0,Red);

if(ticket>0 && ModifyOrder(OP_SELL,ticket,OrderOpenPrice(),myStopLoss,myTakeProfit,CLR_NONE))

{

if(Debug) Print("SELL order opened : ",OrderOpenPrice());

}

else

{

err=GetLastError();

Print("Error opening SELL order : ("+err+") "+ErrorDescription(err));

}

return(0);

}

[CODE]

int HandleTrailingStop(int type,int ticket,double op,double os,double tp)

{

double pt,TS=0,myAsk,myBid;

switch(type)

{

case OP_BUY:

{

myBid=MarketInfo(Symbol(),MODE_BID);

switch(TrailingStopType)

{

case 1: pt=point*StopLoss;

if(myBid-os>pt)

ModifyOrder(type,ticket,op,myBid-pt,tp,Aqua);

break;

case 2: pt=point*TrailingStop;

if(myBid-op>pt && os<myBid-pt)

ModifyOrder(type,ticket,op,myBid-pt,tp,Aqua);

break;

}

return(0);

break;

}

case OP_SELL:

{

myAsk=MarketInfo(Symbol(),MODE_ASK);

switch(TrailingStopType)

{

case 1: pt=point*StopLoss;

if(os-myAsk>pt)

ModifyOrder(type,ticket,op,myAsk+pt,tp,Aqua);

break;

case 2: pt=point*TrailingStop;

if(op-myAsk>pt && os>myAsk+pt)

ModifyOrder(type,ticket,op,myAsk+pt,tp,Aqua);

break;

}

}

return(0);

}

}

Merci d'avance !

tfi_markets

L'erreur 1 n'est pas une erreur, cela signifie simplement que la modification que vous avez l'intention de faire n'entraînera pas de modification de l'ordre (l'ordre restera le même). Vous pouvez laisser le code tel quel ou simplement vérifier que la partie modifiée est différente de la valeur que vous allez lui attribuer.

 

Bonjour, j'ai besoin d'aide pour obtenir le nombre de jours depuis le début d'un graphique renko.

Merci pour votre aide

 
lambic:
Bonjour, j'ai besoin d'aide pour obtenir le nombre de jours depuis le début d'un graphique renko. Merci de votre aide.

Si vous voulez dire depuis la première (la plus ancienne) barre de renko, faites simplement ce qui suit :

int numOfDays = (Time[0]-Time)/(1440*60) ;

 
mladen:
Si vous voulez dire depuis la première (la plus ancienne) barre de renko, faites simplement ce qui suit : int numOfDays = (Time[0]-Time)/(1440*60) ;

Si simple ! Je cherchais une fonction de tableau et c'était simplement Time[]. Désolé c'est stupide. Merci beaucoup !