Question sur le conseiller multi-devises - page 2

 

alexjou, j'ai regardé l'aide et trouvé :

" La classe de mémoire externe définit une variable externe. Le modificateur externe est spécifié avant le type de données. Les variables externes définissent les paramètres d'entrée d'un programme, elles sont accessibles depuis la fenêtre des propriétés du programme. Les tableaux ne peuvent pas agir comme des variables externes. "

Voici le code complet de l'indicateur personnalisé.

#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 Yellow
#property indicator_color2 Red
#property indicator_color3 Red
#property indicator_minimum 0
#property indicator_maximum 100
//---- input parameters
//extern string    st="---Параметры Stochastic---";
extern int       KPeriod =12;
extern int       DPeriod =3;
extern int       Slowing =2;
//extern string    en="---Параметры Envelopes---";
extern int       EnvPeriod=17;
extern int       Deviation=15;
extern int       Shift=1;
//---- buffers
double Stochastic[];
double UP[];
double LOW[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,Stochastic);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,UP);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexBuffer(2,LOW);
//----
   return(0);
  }
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
     int limit;
     int counted_bars=IndicatorCounted();
  //---- последний посчитанный бар будет пересчитан
     if(counted_bars>0) counted_bars--;
     limit=Bars-counted_bars;
  //---- основной цикл
     for(int i=0; i<limit; i++)
 
{
Stochastic[i]=iStochastic(NULL,0,KPeriod,DPeriod,Slowing,MODE_SMA,0,MODE_MAIN,i);
}
     for( i=0; i<limit; i++)
{
UP[i] =iMAOnArray(Stochastic,0, EnvPeriod, Shift,MODE_SMA,i)+Deviation;
LOW[i]=iMAOnArray(Stochastic,0, EnvPeriod, Shift,MODE_SMA,i)-Deviation;
)
 
  return(0);
  }

Comme variables externes de l'EA, j'ai défini

extern int     K__period        =6;
extern int     Env_period      =10; 
extern double  Env_deviation    =12;
 
//---------------------------------------------
int start()
  {
 
... ...
double Env_low[2];
//
double Stochastic[2];
 
Env_low[0]    = iCustom("USDJPY",0,"i-StochEnv",K__period,3,3,Env_period, Env_deviation,1,2,0);
Stochastic[0] = iCustom("USDJPY",0,"i-StochEnv",K__period,3,3,Env_period, Env_deviation,1,0,0);
Stochastic[1] = iCustom("USDJPY",0,"i-StochEnv",K__period,3,3,Env_period, Env_deviation,1,0,1);
Dans le testeur, cette paire fonctionne. Quelle peut être l'erreur ici ?

 
Merci beaucoup, je ne dirai pas non. :-) Je vous écrirai mon adresse e-mail dans ICQ, donnez-moi le numéro.
Je vais vous dire : j'ai juste répondu en premier, les autres sont venus voir la réponse et n'ont rien ajouté. Ne pensez donc pas que tout le monde ici est en colère et ne veut pas partager ses connaissances.
 
Эксперт: iCustom("USDJPY", ...


А индикатор откуда об этом знает? Лучше добавить в секцию extern индикатора строковую переменную вроде


extern string SymbolName = "USDJPY"; // инструмент по умолчанию 

и вызывать стохастик так 

Stochastic[i]=iStochastic(SymbolName, 0, ...

(Опять какие-то глюки форума. В Лисе стрелки не работают, оттго и пишу не по-людски) 
 
#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 Yellow
#property indicator_color2 Red
#property indicator_color3 Red
#property indicator_minimum 0
#property indicator_maximum 100
//---- input parameters
//extern string    st="---Параметры Stochastic---";
extern string    SymbolName = "USDJPY"; 
extern int       TimeFrame = 0; 
extern int       KPeriod =12;
extern int       DPeriod =3;
extern int       Slowing =2;
//extern string    en="---Параметры Envelopes---";
extern int       EnvPeriod=17;
extern int       Deviation=15;
extern int       Shift=1;
//---- buffers
double Stochastic[];
double UP[];
double LOW[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,Stochastic);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,UP);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexBuffer(2,LOW);
//----
   return(0);
  }
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
     int limit;
     int counted_bars=IndicatorCounted();
  //---- последний посчитанный бар будет пересчитан
     if(counted_bars>0) counted_bars--;
     limit=Bars-counted_bars;
  //---- основной цикл
     for(int i=limit-1; i>=0; i--) // индикаторы лучше рассчитывать слева направо
 
{
Stochastic[i]=iStochastic(SymbolName, TimeFrame,KPeriod,DPeriod,Slowing,MODE_SMA,0,MODE_MAIN,i);
}
     for(i=limit-1; i>=0; i--) // см. примечание
{
UP[i] =iMAOnArray(Stochastic,0, EnvPeriod, Shift,MODE_SMA,i)+Deviation;
LOW[i]=iMAOnArray(Stochastic,0, EnvPeriod, Shift,MODE_SMA,i)-Deviation;
)
 
  return(0);
  }


Вызов из эксперта:

iCustom("USDJPY", 0, ...

С iMAOnArray вообще надо обращаться аккуратно. Например, поэкспериментировать с порядком ее расчета. 
А лучше всего такие вещи делать самому. Кстати, для мультивалютного эксперта может потребоваться везде 
явно задавать имя символа и рабочий тайм-фрейм, чтобы избежать умолчательных сюрпризов вроде этого.
 

alexjou !

Est-ce que je vous ai bien compris ??????????

Dans un EA multi-devises, lorsque vous appelez l'indicateur iCustom pour un symbole spécifique, il est préférable de fournir les informations suivantes dans l'indicateur lui-même

extern string SymbolName = "USDJPY" ; // symbole par défaut

Il s'agit en outre d'un réglage dans l'Expert Advisor :

iCustom("USDJPY", 60, ... pour cette paire !

Mais si j'appelle cet indicateur personnalisé pour une autre paire avec d'autres paramètres externes, cela signifie que pour cette autre paire je dois entrer une copie de cet indicateur personnalisé avec un autre nom et définir le symbole d'une autre paire là aussi !

Mais alors il est vraiment plus facile de calculer iMAOnArray à l'intérieur de l'Expert Advisor par vous-même sans aucun induit personnalisé !

 
C'est vrai. Bien qu'il s'agisse d'un travail d'amateur. Ma pratique, par exemple, consiste à utiliser des indicateurs personnalisés pour tester une idée, puis à transférer le code de l'indicateur au conseiller expert si l'idée s'avère efficace. Cette approche garantit pratiquement contre les pièges des valeurs d'indicateur "vides", qui sont difficiles à détecter et peuvent être très gênantes si elles sont programmées sans précaution.
 

Merci pour les explications ! Je vais m'en occuper...

klerk, j'ai des problèmes avec mon email le week-end.

Voici mon adresse électronique pour le conseiller.

rid200549@ya.ru

 
alexjou:
(Опять какие-то глюки форума. В Лисе стрелки не работают, оттго и пишу не по-людски) 
Les problèmes venaient du connecteur de mon clavier sur la carte mère. Le forum n'a absolument rien à voir avec cela. Désolé pour la fausse alerte.
 

klerk, veuillez confirmer ici ou dans le courrier si vous avez reçu mon message.

Et une autre question pour les experts (désolé si c'est trop bête) :

Dans le conseiller expert multidevises -

double bid_GBP = MarketInfo("GBPUSD", MODE_BID);
 double ask_GBP = MarketInfo("GBPUSD", MODE_ASK);
 double point_GBP =MarketInfo("GBPUSD",MODE_POINT);

Et dans les courbes de fuite de chaque paire, devez-vous également saisir et substituer ces valeurs ?

.... ...
if (OrderType()==OP_BUY)                                            {
       if (!Profit_Trailing || (Bid-OrderOpenPrice())>Trailing_Stop*Point) {
        if (OrderStopLoss()<Bid-(Trailing_Stop+Trailing_Step-1)*Point)      {
.... ....
ou peut-on le laisser tel quel ?
 
rid:

Et dans les paires arrière, ces valeurs doivent-elles également être saisies et remplacées ?

Bien sûr.