Alors voilà, un beau code pour archiver le sentimentor de FxBlue.
Ce sont des ptits malins.
Code : Tout sélectionner
#define __NOM "EA_FxBlue_Sentiment_Archive.V1.0"
#property copyright __NOM
#property strict
#property description "Archive le Sentiment indicator pour back test ulterieur"
#property description "La periodicite de stockage est la bougie du Time Frame, PAS les ticks"
#property description "Lancer sur un graphique, le fichier est append ad vitam eternaem"
#property description "Si on veut partir de zero, penser a flinguer le fichier - il est cree si existe pas"
#property description "Le nom du fichier est FXBSentiment_Symbol(), deduit du graphique"
#property description "Le fichier est open et closed a chaque bougie pour pouvoir l'utiliser pendant que ca tourne"
#property description "2018.10.25 08:00;25;8;47;13;32;55"
// V1.0
// On lit tous les buffer de l'indic et l'on stocke en commencant par le datetime de l'open de la Bar[1]
// Pour faciliter l'exploit tous les % sont en string et non en num
#include <stdlib.mqh>
#include <stderror.mqh>
extern string UserName; // Le compte FxBlue
extern string PassWord;
static string CommentStringCompil;
static string NomFic;
static int Traders, LongWin, LongLoss, ShortWin, ShortLoos, PerLong;
enum EnumBuffer { bTraders = 0, bLongWin = 1, bLongLoss = 2, bShortWin = 3, bShortLoos = 4, bPerLong = 5 };
int OnInit(void)
{
// Cosmétique : on règle le look du graphique (facultatif)
ChartSetInteger(0,CHART_SHOW_PERIOD_SEP,false); ChartSetInteger(0,CHART_SHOW_GRID,false);
ChartSetInteger(0,CHART_MODE,CHART_CANDLES);
ChartSetInteger(0,CHART_AUTOSCROLL,true);
ChartSetInteger(0,CHART_SHOW_PERIOD_SEP,true);
ChartSetInteger(0,CHART_SCALEFIX,false);
ChartSetInteger(0,CHART_SHIFT,true); ChartSetDouble(0,CHART_SHIFT_SIZE,15);
ChartSetInteger(0,CHART_SCALE,3); // De 1 à 5, c'est le zoom dezoom, + et -
ChartSetInteger(0,CHART_SHOW_VOLUMES,CHART_VOLUME_HIDE);
ChartSetInteger(0,CHART_SHOW_OHLC,false);
CommentStringCompil = "\r"+"Compil :"+ TimeToString(__DATETIME__);
Comment(CommentStringCompil);
// Creation file si existe pas
NomFic = "FXBSentiment_" + Symbol() + ".csv";
if ( !FileIsExist(NomFic) ) {
int Handle = FileOpen(NomFic, FILE_CSV|FILE_WRITE|FILE_READ, ';' ); // Va créer le fichier
if( Handle < 0 ) Print("Erreur FileOpen, NomFic :",NomFic, " Error code ",GetLastError());
FileClose( Handle);
}
// explore une peu d'historique pour voir
for ( int i = 1; i < 10; i++ ) {
LitLesBuffersDuneBougie(i);
Print("Buffers de la bougie ",i," : ",Traders," , ", LongWin," , ", LongLoss," , ", ShortWin," , ", ShortLoos," , ", PerLong);
}
return(INIT_SUCCEEDED);
}
void OnTick()
{
static datetime MyPreviousTime = 0;
// N E W B A R
if ( MyPreviousTime != Time[0] ) {
MyPreviousTime = Time[0];
// Acquisiton indicateurs
LitLesBuffersDuneBougie(1); // Bar[1] closed
/*
Traders =(int)MathRound( iCustom( NULL, // Symbol
0, // TF du graphique
"", // separateur
UserName, // Le compte FxBlue
PassWord,
"", // separateur
true, true, true, true, true, true, // affichage de tous les buffers
0, // Buffer 0 : Trader (% de trader chez FxBlues qui sont en pose)
1) // Bar[1], bar closed
);
LongWin = (int)MathRound( iCustom( NULL,0,"",UserName,PassWord,"",true, true, true, true, true, true,1,1) );
LongLoss= (int)MathRound( iCustom( NULL,0,"",UserName,PassWord,"",true, true, true, true, true, true,2,1) );
ShortWin = (int)MathRound( iCustom( NULL,0,"",UserName,PassWord,"",true, true, true, true, true, true,3,1) );
ShortLoos = (int)MathRound( iCustom( NULL,0,"",UserName,PassWord,"",true, true, true, true, true, true,4,1) );
PerLong = (int)MathRound( iCustom( NULL,0,"",UserName,PassWord,"",true, true, true, true, true, true,5,1) );
*/
// Open, Write file et Close
int Handle = FileOpen(NomFic, FILE_CSV|FILE_WRITE|FILE_READ, ';' );
if( Handle < 0 ) Print("Erreur FileOpen, NomFic :",NomFic, " Error code ",GetLastError());
FileSeek(Handle, 0, SEEK_END); // a la fin pour append
FileWriteString(Handle,TimeToString(Time[1],TIME_DATE|TIME_MINUTES)); // Une bougie est définie par le time de son open
FileWriteString(Handle,";" + IntegerToString(Traders));
FileWriteString(Handle,";" + IntegerToString(LongWin));
FileWriteString(Handle,";" + IntegerToString(LongLoss));
FileWriteString(Handle,";" + IntegerToString(ShortWin));
FileWriteString(Handle,";" + IntegerToString(ShortLoos));
FileWrite(Handle,";" + IntegerToString(PerLong)); // finis par crlf contrairement à FileWriteString (sinon SEEK_END marche pas)
FileClose( Handle);
} // New bar
}
int LitUnBufferDuneBougie(int _iBougie, int _Buffer) // On s'intéresse à la Bougie[1], mais il y a aussi un historique de 4 heures au lancement
{
// debug - verifie double a zero ??
double tmp = iCustom(
NULL, // Symbol
0, // TF du graphique
"", // separateur
UserName, // Le compte FxBlue
PassWord,
"", // separateur
true, true, true, true, true, true, // affichage de tous les buffers
_Buffer, // Buffer 0 : Trader (% de trader chez FxBlues qui sont en pose)
_iBougie) // Bar[1], bar closed
;
Print( "double tmp :", tmp );
Print( "Last Error code ",GetLastError() ); // 4072 ERR_INDICATOR_CANNOT_LOAD Cannot load custom indicator
int ValeurIndic = (int)MathRound( iCustom(
NULL, // Symbol
0, // TF du graphique
"", // separateur
UserName, // Le compte FxBlue
PassWord,
"", // separateur
true, true, true, true, true, true, // affichage de tous les buffers
_Buffer, // Buffer 0 : Trader (% de trader chez FxBlues qui sont en pose)
_iBougie) // Bar[1], bar closed
);
return(ValeurIndic);
}
void LitLesBuffersDuneBougie(int _iBougie)
{
Traders = LitUnBufferDuneBougie(_iBougie, bTraders); // Variables globale afin d'éviter la ribanbelle de params
LongWin = LitUnBufferDuneBougie(_iBougie, bLongWin);
LongLoss = LitUnBufferDuneBougie(_iBougie, bLongLoss);
ShortWin = LitUnBufferDuneBougie(_iBougie, bShortWin);
ShortLoos = LitUnBufferDuneBougie(_iBougie, bShortLoos);
PerLong = LitUnBufferDuneBougie(_iBougie, bPerLong);
A moins que j'ai fait une connerie... si quelqu'un trouve une erreur ?