Erreurs, bugs, questions - page 33

 
Urain:

Il s'agit d'unesuggestion digne d'intérêt,

Bien que, du point de vue de la logique ordinaire, cela revienne à se gratter l'oreille gauche avec la main droite (mais cela ne dépend pas de vous, mais des développeurs),

pourquoi la possibilité d'appeler les données d'un instrument non natif ?

si vous devez encore créer des indicateurs personnalisés et les appeler à partir d'un symbole requis, en général, la conclusion est "think head I buy".

La possibilité d'un tel appel est nécessaire, les développeurs ne pouvaient sûrement pas supposer une telle approche lors de l'écriture des indices.

Je veux dire l'indication de l'outil dans les paramètres de l'indicateur de l'utilisateur (et non dans les paramètres iCustom() comme cela devrait être le cas selon eux).


PS

La priorité à l'œuvre avec iCustom() semble avoir été initialement donnée au trading mécanique qui suppose en fait que certains moments seront considérés et certaines actions seront effectuées dans l'Expert Advisor et seulement ensuite iCustom() sera appelé pour l'indicateur personnalisé.

Sinon, tout le travail et la responsabilité incombent au programmeur qui met en œuvre le code de l'indyke (ce qui peut entraîner des erreurs et des conséquences fatales, car un indyke trop fantaisiste peut entraîner le freinage ou le plantage du système dans son ensemble).

 
Urain:

Suggestion digne d'attention,

Bien que, encore une fois, j'appelle l'indicateur prêt pour l'EUR avec des données sur le JPY (par exemple, l'histoire du yen n'est pas suffisante)

Je n'ai pas de données pour cette longueur et qu'est-ce que cela va me dire ? ?? la même chanson.

Il est beaucoup plus facile de traiter les erreurs et les goulets d'étranglement dans l'outil natif, et la vérification préliminaire et la vérification finale sont effectuées avant et après l'appel dans le conseiller expert ou l'indicateur de demande de données.

Je suppose qu'il existe une deuxième voie, qui est fondamentalement mauvaise de mon point de vue. Selon sa logique, vous devez créer une ou plusieurs fonctions dans l'indicateur (appelées depuis la calculatrice), y calculer tout ce dont vous avez besoin et renvoyer le résultat à la calculatrice.

PS

Mais voilà - vous pouvez calculer le nombre de barres d'un symbole arbitraire. Mais qu'en est-il d'autres choses ?

 
Prival:

Bug. Description. ATS toujours sur le marché (rollover par double lot 0.2).

Mode test tous les tics. Tout est normal.

mode test, en ouvrant les prix. la même pièce.

Pour une raison quelconque, il se divise en deux transactions. Peut-être que c'est juste la façon dont il est affiché, mais ce n'est pas bien. Il ne devrait pas être de cette façon.

Réorganisez les commandes d'ouverture avec les commandes de fermeture. Il doit être dans cet ordre

- positions rapprochées

- modifier les positions

- postes vacants

Ainsi, vos positions de fermeture et d'ouverture seront sur la même barre.

 
gpwr:

Réorganisez les commandes d'ouverture avec les commandes de fermeture. L'ordre doit être le suivant

- positions rapprochées

- modifier les positions

- postes vacants

Alors votre fermeture et votre ouverture seront sur la même barre.

Si le marché est à l'achat 0,1, j'ouvre une vente 0,2. Le résultat de cette opération devrait être 0,1,1 en une seule transaction, pas deux.

Je pense que les développeurs ont compris ce que je disais.

 

J'ai écrit ce code

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot Label1
#property indicator_label1  "I1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  Red
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot Label2
#property indicator_label2  "I2"
#property indicator_type2   DRAW_LINE
#property indicator_color2  Green
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- indicator buffers
double         I1Buffer[];
double         I2Buffer[];
int OnInit()
  {
   SetIndexBuffer(0,I1Buffer,INDICATOR_DATA);
   SetIndexBuffer(1,I2Buffer,INDICATOR_DATA);
   return(0);
  }

int OnCalculate (const int rates_total,      // размер массива price[]
                 const int prev_calculated,  // обработано баров на предыдущем вызове
                 const int begin,            // откуда начинаются значимые данные
                 const double& price[])      // массив для расчета
  {
   string Symbol_1="EURUSD",Symbol_2="GBPUSD";
   if(rates_total<1) return(0);
   double Arr1[],Arr2[];
   int end,rez0,rez1;
   end=MathMin((int)SeriesInfoInteger(Symbol_1,0,SERIES_BARS_COUNT)-1,(int)SeriesInfoInteger(Symbol_2,0,SERIES_BARS_COUNT)-1);
   end=MathMin(end,rates_total-prev_calculated+1);
   rez0=CopyClose(Symbol_1,PERIOD_CURRENT, 0,end, Arr1);
   if(rez0==-1){Print("Ошибка копирования ",Symbol_1," ",GetLastError()); return(0);}
   rez1=CopyClose(Symbol_2,PERIOD_CURRENT, 0,end, Arr2);
   if(rez1==-1){Print("Ошибка копирования ",Symbol_2," ",GetLastError()); return(0);}
   if(rez1!=rez0){Print("Ошибка Синхронизации"); return(0);}
  
   ArraySetAsSeries(Arr1,true);
   ArraySetAsSeries(Arr2,true);
     
   int li=rates_total-1;  
   for(int i=0;i<end;i++)
     {      
      I1Buffer[li]=Arr1[i]+0.26;
      I2Buffer[li]=Arr2[i];
      li--;
     }
   return(rates_total);
  }

Il semble fonctionner correctement, mais je ne sais pas s'il prend tout en compte.
Si c'est le cas, voici une variante pour vous.
Si ce n'est pas le cas, veuillez le corriger.

 

Maintenant, j'ai une question.

Pourquoi l'indicateur est appelé depuis l'Expert Advisor, la valeur ne coïncide pas avec l'indicateur.

Par exemple, l'indicateur est à 1.5123 et l'EA à 1.5117.

J'ai essayé de l'utiliser parce que je ne sais pas comment le lire et je ne veux pas le manquer.

static int Handle;
int bars;
void OnInit()
  {
   Handle=iCustom(NULL,0,"proverka");
  }

void OnTick()
  {
   if(bars==Bars(_Symbol,_Period))return;
   bars=Bars(_Symbol,_Period);
   double buf1[],buf2[];    
   if(CopyBuffer(Handle,0,0,2,buf1)<0 || CopyBuffer(Handle,1,0,2,buf2)<0)Alert("Ошибка копирования значений индикаторных буферов ",GetLastError(),"!!");
   Print("Время "+TimeToString(TimeCurrent(),TIME_DATE|TIME_MINUTES),"   буф1-",buf1[0],"   буф2-",buf2[0]);
  }

et l'image

Et le premier tampon, l'instrument sur lequel il fonctionne, coïncide.

Dossiers :
prover.mq5  1 kb
proverka.mq5  2 kb
 
ddd06:

Maintenant, j'ai une question.

Pourquoi l'indicateur est appelé depuis l'Expert Advisor, la valeur ne coïncide pas avec l'indicateur.

Par exemple, l'indicateur est à 1.5123 et l'EA à 1.5117.

Voici le code de l'EA, d'ailleurs il est dupliqué dans la pièce jointe.

Et vous regardez la valeur précédente de l'indicateur. Je pense que c'est exactement 1,5117. Prendre la valeur actuelle (dernière) par l'index 1. Ou assigner des tableaux SetAsSeries(bufX,true)
 
stringo:
Et vous regardez la valeur de l'indicateur précédent.
1.512380 - actuel 1.512310 - précédent
 
ddd06:

J'ai écrit ce code

Il semble fonctionner correctement, mais je ne sais pas s'il prend tout en compte.
Si c'est le cas, voici une variante pour vous.
Si ce n'est pas le cas, veuillez le corriger.

Oui, ma version retravaillée comporte également une vérification de la longueur du tableau, mais je me suis perdu dans les directions de la série, comme d'habitude,

et il s'est avéré que le dessin a continué, mais comme la longueur du tableau est inférieure à la longueur du graphique, le dessin est allé de la fin au milieu (ou à peu près),

C'est pourquoi j'ai eu l'impression qu'il n'y avait pas de rendu.

En général, je pense qu'il y aura de la confusion dans cet endroit pendant longtemps,

parce que le même problème se posait avec les visiteurs de mql4.com et maintenant ils téléchargent ici.

 
Urain:

C'est vrai.

C'est génial. Je pense que le code est simple et local, vous pouvez donc l'utiliser comme base.

Question sur l'EA - dois-je écrire au Service Desk?

Общайтесь с разработчиками через Сервисдеск!
Общайтесь с разработчиками через Сервисдеск!
  • www.mql5.com
Ваше сообщение сразу станет доступно нашим отделам тестирования, технической поддержки и разработчикам торговой платформы.
Raison: