[ARCHIVE]Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Je ne peux aller nulle part sans toi - 5. - page 298

 
Merci et bonne chance à vous artmedia70
 
palomnik:
Merci et bonne chance à vous artmedia70
Bien... La santé : c'est une ressource non renouvelable. Merci :)
 
ed3sss:

Bonjour.

Comment puis-je afficher sur le graphique l'inscription sur l'instrument en cours Profit/perte des ordres ouverts.

Il est difficile de vérifier dans l'Expert Advisor s'il a ouvert des positions ou non (terminal on/off) et de récupérer le dernier volume de lot avant de fermer le terminal.

Merci.


Bonjour, personne n'est au courant ?
 

Si j'ai effectué des transactions dans le passé, j'utilise la fonction orderprofit et j'additionne tout l'historique des transactions.

Je me demande si quelqu'un a une réponse à ma question.

 
artmedia70:

Il y a une faille dans ce code. Ici, sorti de son contexte:


Le fait est que l'expression

Par conséquent, la valeur du lot sera arrondie à une décimale.


Lisez la suite, ça peut vous aider.



Je l'espère bien. Merci. Je vais relire le fil de discussion ci-dessus pour renforcer ce point. Je ne veux pas laisser de vide.
 
ed3sss:

Bonjour, y a-t-il quelqu'un qui s'y connaît ?


Eh bien, si je comprends bien, tout est élémentaire. Tout ce dont vous avez besoin, ce sont des connaissances élémentaires.

1. Vous faites un dépassement des commandes.

2. Vérifier que l'ordre est ouvert, c'est-à-dire que l'heure de clôture de l'ordre est relative à zéro.

3. si l'ordre est ouvert, afficher ses données nécessaires, son profit, son type, etc.

 
palomnik:

Si j'ai effectué des transactions dans le passé, j'utilise la fonction orderprofit et j'additionne tout l'historique des transactions.

Je me demande si quelqu'un a des réponses à ma question.

Copiez le code entier dans votre conseiller expert

comme ceci

//+------------------------------------------------------------------+
//|                                                        Xrust.mq4 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"


extern int    TimeFrame=0;//Если=0, то текуший
extern string FrApNam="Ap";//Имя линии соотв.Фракталу вверх
extern string FrDnNam="Dn";//Имя линии соотв.Фракталу вниз
extern color  ClAp=Blue;//Цвет линии соотв.Фракталу вверх
extern color  ClDn=Red;//Цвет линии соотв.Фракталу вниз
//-----------------------------------------------------------------------------+
double FrApPrise,FrDnPrise;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
  if(TimeFrame==0){TimeFrame=Period();}
  IndicatorShortName("Factal_Level_Xrust"+TimeFrame);
  FrApNam=StringConcatenate(FrApNam,TimeFrame);
  FrDnNam=StringConcatenate(FrDnNam,TimeFrame); 
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
  ObjectDelete(FrDnNam);
  ObjectDelete(FrApNam);
  Comment(" ");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   LineAp();
   LineDn();
   
   int diap=MathRound((FrApPrise-FrDnPrise)/Point);
   
   Comment("\n"," LineDn  = ",FrDnPrise,
           "\n", " LineAp  = ",FrApPrise,
           "\n"," diap  = ",diap );

//----
   return(0);
  }
//+------------------------------------------------------------------+
//-----------------------------------------------------------------------------+
// Ищет горизонтальную линию по имени перерисовывает если изменилась цена      |   
//-----------------------------------------------------------------------------+
   void  LineDn(){
   FrDnPrise=0;
   double  FrPrise=NormalizeDouble(FindNearFractal(0,TimeFrame,MODE_LOWER),MarketInfo(Symbol(),MODE_DIGITS));
   FrPrise=NormalizeDouble(FrPrise,MarketInfo(Symbol(),MODE_DIGITS));
   //Comment(FrPrise);
   if(ObjectFind(FrDnNam)==0){
     if(ObjectGet(FrDnNam,OBJPROP_PRICE1)==FrPrise){return;}}
   FrDnPrise=FrPrise;  
   ObjectDelete(FrDnNam);
   SetHLine(ClDn,FrDnNam,FrDnPrise,0,1);
   WindowRedraw();
   return;} 
//-----------------------------------------------------------------------------+
// Ищет горизонтальную линию по имени перерисовывает если изменилась цена      | 
//-----------------------------------------------------------------------------+
   void  LineAp(){
   FrApPrise=0;
   double FrPrise=NormalizeDouble(FindNearFractal(0,TimeFrame,MODE_UPPER),MarketInfo(Symbol(),MODE_DIGITS));
   FrPrise=NormalizeDouble(FrPrise,MarketInfo(Symbol(),MODE_DIGITS));
   if(ObjectFind(FrApNam)==0){
     if(ObjectGet(FrApNam,OBJPROP_PRICE1)==FrPrise){return;}}
   FrApPrise=FrPrise; 
   ObjectDelete(FrApNam); 
   SetHLine(ClAp,FrApNam,FrApPrise,0,1);
   WindowRedraw();
   return;}
//-----------------------------------------------------------------------------+   
//   Киму Респект и уважуха !!!                                                |       
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 07.10.2006                                                     |
//|  Описание : Поиск ближайшего фрактала. Возвращает ценовой уровень.         |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy   - наименование инструмента      ("" или NULL - текущий символ)     |
//|    tf   - таймфрейм                     (    0       - текущий ТФ)         |
//|    mode - тип фрактала                  (MODE_LOWER|MODE_UPPER)            |
//+----------------------------------------------------------------------------+
double FindNearFractal(string sy="0", int tf=0, int mode=MODE_LOWER) {
  if (sy=="" || sy=="0") sy=Symbol();
  double f=0;
  int    d=MarketInfo(sy, MODE_DIGITS), s;
  if (d==0) if (StringFind(sy, "JPY")<0) d=4; else d=2;

  for (s=2; s<100; s++) {
    f=iFractals(sy, tf, mode, s);
    if (f!=0) return(NormalizeDouble(f, d));
  }
  Print("FindNearFractal(): Фрактал не найден");
  return(0);
}
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 30.03.2008                                                     |
//|  Описание : Установка объекта OBJ_HLINE горизонтальная линия               |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    cl - цвет линии                                                         |
//|    nm - наименование               ("" - время открытия текущего бара)     |
//|    p1 - ценовой уровень            (0  - Bid)                              |
//|    st - стиль линии                (0  - простая линия)                    |
//|    wd - ширина линии               (0  - по умолчанию)                     |
//+----------------------------------------------------------------------------+
void SetHLine(color cl, string nm="", double p1=0, int st=0, int wd=1) {
  if (nm=="") nm=DoubleToStr(Time[0], 0);
  if (p1<=0) p1=Bid;
  if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_HLINE, 0, 0,0);
  ObjectSet(nm, OBJPROP_PRICE1, p1);
  ObjectSet(nm, OBJPROP_COLOR , cl);
  ObjectSet(nm, OBJPROP_STYLE , st);
  ObjectSet(nm, OBJPROP_WIDTH , wd);
}

ou

ou utiliser les fonctions

int ObjectFind( string name) //Поиск объекта с указанным именем

double ObjectGet( string name, int prop_id) //Функция возвращает значение указанного свойства объекта

pour chercher un objet. Il n'y a pas d'autre moyen.
 
Non, c'est inséré, mais la valeur est complètement hors normes.
 
palomnik:
Non, ça marche, mais la valeur sort absolument du plafond
.


Essayez de supprimer les paramètres de l'indicateur dans le code de l'EA. Ensuite, les paramètres seront repris du code prescrit dans l'indicateur.

J'ai aussi obtenu des valeurs gauches, j'ai supprimé les paramètres du code et c'est OK.

 
palomnik:

//-----------------------------------------------------------------------------+
//Kim Respect et respect ! !! |
//+----------------------------------------------------------------------------+

C'est de loin la partie la plus stressante du code)))).

Ok. Je ne comprends rien. J'ai mis en place le second TF. Tout devrait fonctionner comme sur des roulettes. Mais ce n'est pas le cas. Non, ça marche, mais ce n'est pas comme prévu. Je l'ai vérifié des milliers de fois. Je ne vois moi-même aucune erreur syntaxique ou algorithmique. Je vais essayer d'expliquer. Je joins le code complet. Donc :

Δtime=TimeCurrent()-time;//перестраховка на случай, если TimeCurrent() во время выполнения цикла изменится
switch(Δtime){
  case 0 ://если секунда не прошла
    AccumulatorOfTicks(false);//заносим в массив-накопитель
    break;
  case 1 ://если прошла ОДНА секунда после последнего тика
    WriteBar();//по предыдущему тику рисуем свечу
    AccumulatorOfTicks(true);//и ловим текущий тик
    break;
  default://если прошло НЕСКОЛЬКО секунд после последнего тика
    WriteBar();//по предыдущему тику рисуем свечу
    Δtime--; time++;//уменьшаем разницу на единицу, т.к. свечу уже нарисовали
    while(Δtime!=0) WriteDash();//и рисуем прочерки по кол-ву пропущ. сек. минус один
    AccumulatorOfTicks(true);//ловим текущий тик
}

Au début de start(), j'ai mis un gestionnaire pour le nombre de secondes écoulées depuis le dernier start(). Les sections répétées ont été déplacées vers des fonctions définies par l'utilisateur. La nouvelle valeur time=TimeCurrent() y est affectée, dans les fonctions utilisateur.

void AccumulatorOfTicks(bool AtFirst){
        if (AtFirst){
                ArrayResize(bid, 1);//урезаем использованные массивы
                ArrayResize(ask, 1);
                i=0;//обнуляем счётчик тиков в секунду
                time=TimeCurrent();//приводим счётчик времени к текущему
        }else{
                ArrayResize(bid, i+1);
                ArrayResize(ask, i+1);
                i++;
        }
        bid[i]=MarketInfo(symbol, MODE_BID);
        ask[i]=MarketInfo(symbol, MODE_ASK);
        if (bid[i]==ask[i]) Alert("from accumulator: bid=ask");
}

La fonction fonctionne selon deux modes : dans la première branche, AtFirst=true, elle ne fait qu'attraper un tick et met à zéro le stockage du tableau, tandis que dans la seconde branche, AtFirst=false, elle fonctionne exactement comme un stockage de tick. En d'autres termes, soit nous mettons à zéro et tronquons le magasin et attrapons le bid-ask dans une cellule zéro, soit nous rallongeons le magasin et attrapons le bid-ask. L'alerte a été définie uniquement à des fins de débogage. Je décrirai plus loin la condition de mise à zéro de l'accumulateur.

void WriteBar(){
        if(FileSeek(hand1e, fpos, SEEK_SET) == false){//перемещаем указатель на новую позицию, которую мы запомнили в FileTell
                //проверяем, переместилось-не переместилось, это я убрал, т.к. к вопросу не относится.
        }else{
                FileWriteInteger(hand1e,  time,   LONG_VALUE);//TimeCurrent()
                FileWriteDouble (hand1e,  bid[0], DOUBLE_VALUE);//Open[]
                FileWriteDouble (hand1e,  bid[ArrayMaximum(bid)], DOUBLE_VALUE);//High[]
                FileWriteDouble (hand1e,  ask[ArrayMinimum(ask)], DOUBLE_VALUE);//Low[]
                FileWriteDouble (hand1e,  ask[ArraySize(ask)-1], DOUBLE_VALUE);//Close[]
                FileWriteDouble (hand1e,  ArraySize(ask), DOUBLE_VALUE);//Volume[]
                FileFlush       (hand1e);
                fpos = FileTell (hand1e);//запоминаем позицию записи в файле
                if(ArraySize(ask)==2) Alert(StringConcatenate(TimeToStr(TimeCurrent(), TIME_SECONDS), " - volume = ", ArraySize(ask)));
                if(bid[0]==ask[ArraySize(ask)-1]) Alert(StringConcatenate(TimeToStr(TimeCurrent(), TIME_SECONDS), " - bid=ask, Ticks = ", ArraySize(ask)));
                /*Необходимое пояснение. Хотя код рассчитан в т.ч. на тени свечей (т.е. независимыми от Open и Close
                 High и Low), в реальности их на чарте не будет, т.к. в секунде максимум 2 тика, три тика в секунде
                я ещё не встречал. Поэтому в массиве из двух элементов (т.е. двух тиков)
                один будет максимумом, другой минимумом, - и невольно совпадать с Open и Close.*/
        }
}

La fonction de "dessin" de la bougie (ajout d'une bougie au .hst ouvert dans le graphique autonome). De même - je mets des alertes pour le débogage. La première alerte signale deux ticks capturés en une seconde (la taille du tableau est égale à deux, et dans l'idée, le volume devrait être égal à deux), tandis que la seconde signale un bit égal à ack dans le tick capturé (alerte similaire dans le lecteur : mais ils fonctionnent de manière non synchrone pour une raison quelconque), et le volume du chandelier. Tout cela est en théorie, en fait, lorsqu'on entre dans le fichier (par alerte), par exemple, deux (ou 0x00 00 00 00 00 00 40, double 2.0), il se trouve que c'est toujours un (0x00 00 00 00 00 F0 3F, double 1.0 au format BigEndian). J'ai l'habitude d'ignorer cette alerte dans le lecteur, elle émet souvent des bips, je travaille avec ces deux-là.

void WriteDash(){
        if(FileSeek(hand1e, fpos, SEEK_SET) == false){//перемещаем указатель на новую позицию, которую мы запомнили в FileTell
                //аналогично убрал, т.к. к вопросу не относится.
        }else{//ставим прочерк на Close[0]
                Δtime--; time++;
                FileWriteInteger(hand1e,  time,   LONG_VALUE);//TimeCurrent()
                FileWriteDouble (hand1e,  ask[ArraySize(ask)-1], DOUBLE_VALUE);//Open[]
                FileWriteDouble (hand1e,  ask[ArraySize(ask)-1], DOUBLE_VALUE);//High[]
                FileWriteDouble (hand1e,  ask[ArraySize(ask)-1], DOUBLE_VALUE);//Low[]
                FileWriteDouble (hand1e,  ask[ArraySize(ask)-1], DOUBLE_VALUE);//Close[]
                FileWriteDouble (hand1e,  0, DOUBLE_VALUE);//Volume[]
                FileFlush       (hand1e);
                fpos = FileTell (hand1e);//запоминаем позицию записи в файле
        }
}

La fonction "dessine" un tiret au cas où il n'y aurait pas eu de tic-tac dans la seconde en question. Il fonctionne selon l'algorithme suivant :

Δtime=0 : attrape (copie) les ticks.

Δtime=1 : dessiner un chandelier sur le tick qui a été attrapé auparavant, puis attraper le tick (avec un accumulateur préalablement mis à zéro).

Δtime>1 : Dessiner une bougie sur le tick attrapé avant, dessiner des tirets sur la ligne Close[0] dans la quantité deΔtime-1, attraper un tick (avec accumulateur préalablement mis à zéro). Dans tous les cas, l'accumulateur doit être mis à zéro lorsqu'une bougie est déjà tirée dessus et que cela signifie que l'accumulateur n'est plus nécessaire. Cela se produit lorsqueΔtime>0.

Faisons le tour :

La flèche a dessiné les moments où l'offre est censée être égale à l'asc et le volume est censé être égal à un. Je n'ai pas capturé le fond avec des volumes, on n'y voit rien de toute façon, c'est peu profond. Mais ils sont tous de niveau, c'est-à-dire soit zéro soit un, aucun ne va jusqu'à deux (bien que l'alerte soit signalée). Deux ticks par seconde - toujours au survol de la souris montre ironiquement le volume = 1, et l'offre est égale à l'asku montre aussi ironiquement le volume = 0. Pourquoi ? Je comprends qu'il y a une erreur quelque part, mais il est fort probable que je ne la remarque pas, ou que je regarde au mauvais endroit. Je joins le code, j'ai bien commenté ma partie du code, vérifié les indentations partout, supprimé les inluders, juste sélectionné les fonctions à utiliser, pour que ça compile plus vite. La seule remarque - il ne fonctionne pas hors ligne, c'est-à-dire avec TimeLocal, contrairement au collecteur de tics original, parce que j'ai écrit if(tickTimeLocal==true) à partir de zéro (car je n'en avais pas vraiment besoin). J'ai essayé de le traduire en Expert Advisor en suivant les conseils de Taras - les chandeliers n'apparaissent pas dans le graphique autonome (mais la ligne de la cotation actuelle bouge bien).

Dossiers :
fif.ta.mq4  18 kb