Questions d'un "mannequin - page 53

 
Ne pas confondre la recréation inconditionnelle et stupide (par ignorance) d'indicateurs à chaque tick avec la création intelligente (rare et nécessaire) d'un indicateur. Dans le premier cas, vous obtenez un frein au centuple et une fuite de ressources, et dans le second, vous obtenez des performances parfaites.
 
Renat:
Ne pas confondre la recréation inconditionnelle et stupide (par ignorance) d'indicateurs à chaque tick avec la création intelligente (rare et nécessaire) d'un indicateur. Dans le premier cas, vous obtenez un frein et une fuite de ressources au centuple, et dans le second - un travail parfait.

Je suis bien conscient que Karlson a commis une erreur par ignorance, et je comprends aussi la nature de cette erreur.

Mais proposez un plan raisonnable pour résoudre son problème. La personne doit utiliser le code écrit dans l'indicateur mais le ou les paramètres de ce code sont déterminés dynamiquement avant chaque accès aux données de l'indicateur ?

J'ai une solution, elle contient une dll, mais vous voulez utiliser du mql pur, alors proposez une solution en mql.

HZ J'ai déjà mentionné OnCalculate() et les calculs dans les événements, mais vous pouvez passer trois paramètres via l'événement. Dans ma solution, une longue dll peut passer l'adresse d'un tableau avec des paramètres et l'indicateur recevra des données à cette adresse.

Si vous avez une solution mql, il suffit de pointer du doigt.

 
Urain:

Je suis bien conscient que Karlson a commis une erreur par ignorance, et je comprends aussi la nature de cette erreur.

Mais proposez un plan raisonnable pour résoudre son problème. La personne doit utiliser le code écrit dans l'indicateur, mais le ou les paramètres de ce code sont définis dynamiquement avant chaque référence aux données de l'indicateur ?

Combien d'indicateurs différents doivent être créés en réalité ? Probablement pas plus de 10, sinon ce sera un gaspillage insensé de ressources.

Puisqu'il n'y a pas de modification des paramètres, vous pouvez créer une collection d'indicateurs, et celui qui est nécessaire y sera ajouté au moment voulu. S'il y a moins de 10 indicateurs et qu'ils ont une signification claire (initial, confirmant, corrigeant, etc.), vous pouvez créer des variables nommées de poignées avec les paramètres nécessaires.

 
Urain:

Mais proposez un plan raisonnable pour résoudre son problème. La personne doit utiliser le code écrit dans l'indicateur, mais le ou les paramètres de ce code sont déterminés dynamiquement avant chaque référence aux données de l'indicateur ?

J'y ai réfléchi. Si les paramètres du code sont déterminés dynamiquement avant chaque accès aux données de l'indicateur, pourquoi ne pas inclure la procédure de détermination de ces paramètres dans le code de l'indicateur ? En d'autres termes, tous les calculs doivent être mis en œuvre dans l'indicateur.

Ou existe-t-il des situations où une telle approche est impossible en principe ?

 
Pouvez-vous me dire pourquoi, dans un indicateur aussi simple, la barre de zéro (la première à partir de la droite) n'est pas calculée partout sauf sur le graphique hebdomadaire?

#include <MovingAverages.mqh>
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
#property indicator_color1 LightBlue
#property indicator_type1   DRAW_LINE
#property indicator_width1 2

input int PERIOD = 80;
input ENUM_MA_METHOD  method = MODE_SMA;
input ENUM_APPLIED_PRICE PRICE = PRICE_CLOSE;
double Uptrend[];
double ExtRsiArray_TF2[];
double mabuf[];
int handleMA,handleMA2;

int OnInit()
  {
   SetIndexBuffer(0, Uptrend);
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);  
   ArraySetAsSeries(Uptrend,true);
   handleMA=iMA(NULL, 0, PERIOD, 0, method, PRICE);
   handleMA2=iMA(NULL, 0, PERIOD/2, 0, method, PRICE);
   return(0);
  }
  
double WMA(int ai_0,int a_period_4) {
int some;
if(a_period_4==PERIOD)
 if(CopyBuffer(handleMA,0,ai_0,1,ExtRsiArray_TF2)<=0)
  {Alert("Error",GetLastError());
   return(0);
  }
some=PERIOD/2;
if(a_period_4==some)
 if(CopyBuffer(handleMA2,0,ai_0,1,ExtRsiArray_TF2)<=0)
  {Alert("Error",GetLastError());
   return(0);
  }
return (ExtRsiArray_TF2[0]);
}

int OnCalculate (const int rates_total,      
                 const int prev_calculated, 
                 const int begin,          
                 const double& price[] 
   )
  { ArraySetAsSeries(price,true);
    int counted_bars = prev_calculated; 
    if(counted_bars < 0) return(-1); 
    int x = 0; 
    int p = MathSqrt(PERIOD);              
    int e = rates_total - counted_bars + PERIOD + 1; 
    double vect[], trend[]; 
    if(e > rates_total) e = rates_total;    
    ArrayResize(vect, e); 
    ArraySetAsSeries(vect, true);
    ArrayResize(trend, e); 
    ArraySetAsSeries(trend, true);
    ArrayResize(mabuf, e); 
    ArraySetAsSeries(mabuf, true);
    for(x = 0; x < e; x++)        vect[x] = 2*WMA(x, PERIOD/2) - WMA(x, PERIOD);
    if(method==MODE_SMA)
    SimpleMAOnBuffer(e,prev_calculated,PERIOD+1,p,vect,mabuf);

    for(x = 0; x < e-PERIOD; x++) Uptrend[x] = mabuf[x];
    return(rates_total);                
  }
 
Yedelkin:

J'ai réfléchi pendant un moment. Si le ou les paramètres du code sont déterminés dynamiquement avant chaque accès aux données de l'indicateur, pourquoi ne pas inclure la procédure de détermination de ces paramètres dans le code de l'indicateur ? En d'autres termes, tous les calculs doivent être mis en œuvre dans l'indicateur.

Ou existe-t-il des situations où une telle approche est impossible en principe ?

Il y a des situations, où les paramètres sont calculés par un autre indicateur et renvoyés au Conseiller Expert, et le Conseiller Expert décide du modèle à utiliser en fonction des neurones. Nous ne savons pas à l'avance quel ensemble de paramètres sera appliqué.

 
Expert:
Pouvez-vous me dire pourquoi, dans un indicateur aussi simple, la barre zéro (la première à partir de la droite) n'est pas calculée partout sauf sur le graphique hebdomadaire?


Oups) J'ai mis ici :SimpleMAOnBuffer(e,prev_calculated,PERIOD+1,p,vect,mabuf) ; au lieu de e - rates_total et tout fonctionne)
 
Expert:
Oups) substitué ici :SimpleMAOnBuffer(e,prev_calculated,PERIOD+1,p,vect,mabuf) ; au lieu de e - rates_total et tout a fonctionné)

Correction des bugs de l'homme avec le surnom Expert? il devrait être dans le thème humour.
 

J'essaie de construire un conseiller expert multi-devises. Jusqu'à présent, j'ai opté pour le schéma proposé par Nikolay Kositsin dans son article"Creating an Expert Advisor that trades on different symbols". J'ai été confronté au problème suivant : les résultats sont différents lorsqu'on effectue un test en utilisant des symboles différents mais les mêmes paramètres. J'ai parcouru le forum et j'ai constaté que beaucoup sont arrivés à la conclusion que ce problème peut être résolu en utilisant la fonction OnTimer(). Andrey Khatimlansky l'a conseillé ici:

Отвяжитесь от тиков конкретного инструмента (OnTick) - это же мультивалютник! Работайте по таймеру или ловите момент образования бара на всех рабочих инструментах, это будет надежнее.

J'ai essayé d'attraper le moment de la formation des barres sur tous les instruments, mais je n'ai pas réussi à obtenir le résultat souhaité.

Par exemple :

Dans la fonction qui est destinée à détecter une nouvelle barre, je spécifie explicitement l'instrument et le cadre temporel.

bool isNewBar(string Symbol_, ENUM_TIMEFRAMES Timeframe)
{
 // В статической переменной будем помнить время открытия последнего бара
 static datetime last_time = 0;
 // Текущее время
 datetime lastbar_time = (ENUM_SERIES_INFO_INTEGER)SeriesInfoInteger(Symbol_,Timeframe,SERIES_LASTBAR_DATE);

 // Если это первый вызов функции
 if(last_time == 0)
   {
    // Установим время и выйдем 
    last_time = lastbar_time;
    return(false);
   }

 // Если время отличается
 if(last_time != lastbar_time)
   {
    // Запомним время и вернем true
    last_time = lastbar_time;
    return(true);
   }
 // Дошли до этого места - значит бар не новый, вернем false
 return(false);
}

Dans la fonction OnTick(), le schéma suggéré par Nikolay Kositsin.

Par exemple :

void OnTick()
{ 
 // Объявление массивов переменных для торговых сигналов  
 static bool UpSignal[2], DnSignal[2];

 // Получение торговых сигналов
 TradeSignalCounter(0, остальные параметры);
 TradeSignalCounter(1, остальные параметры);

 // Совершение торговых операций
 TradePerformer(0, остальные параметры);
 TradePerformer(1, остальные параметры);
}


La fonction isNewBar(Symbol,Timeframe) est appelée dans la fonction dans laquelle la transaction est exécutée, c'est-à-dire TradePerformer(paramètres).

Par exemple :

bool TradePerformer(параметры)
{

...

 if(isNewBar(Symbol_,Timeframe))
   {
    Trailing_Stop(параметры);
   
    Open_Source_Position(параметры);
   }
 return(true);
}


C'est-à-dire qu'une nouvelle barre est vérifiée pour chaque symbole séparément. S'il n'y a pas de nouvelle barre, nous vérifions le symbole suivant. Et c'est ce qui se passe à chaque tic. Mais cette variante ne fonctionne pas.

Veuillez m'indiquer comment implémenter correctement la vérification d'une nouvelle barre dans un Expert Advisor multi-devises dans le schéma donné.
 
Urain:
Devrait être dans le fil d'humour pour corriger les erreurs commises par quelqu'un appelé Expert?
Dans ce forum, vous pouvez et devez corriger les erreurs dans le code Expert, indépendamment de la course ou du calendrier :)