Frage zum Berater für mehrere Währungen - Seite 2

 

alexjou, ich habe in der Hilfe nachgesehen und gefunden:

"Die externe Speicherklasse definiert eine externe Variable. Der externe Modifikator wird vor dem Datentyp angegeben. Externe Variablen definieren die Eingabeparameter eines Programms; sie sind über das Fenster Programmeigenschaften zugänglich. Arrays können nicht als externe Variablen fungieren. "

Hier ist der gesamte Code des benutzerdefinierten Indikators.

#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);
  }

Als externe Variablen setze ich die EA

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);
Im Testgerät funktioniert dieses Paar. Worin kann der Fehler hier liegen?

 
Vielen Dank, ich werde nicht nein sagen. :-) Ich schreibe dir meine E-Mail Adresse in ICQ, gib mir die Nummer.
Ich sage Ihnen Folgendes: Ich habe nur zuerst geantwortet, andere haben die Antwort gesehen und nichts hinzugefügt. Denken Sie also nicht, dass alle hier so wütend sind und ihr Wissen nicht teilen wollen.
 
Эксперт: 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!

Habe ich Sie richtig verstanden??????????

Wenn Sie in einem EA mit mehreren Währungen den iCustom-Indikator für ein bestimmtes Symbol aufrufen, ist es besser, im Indikator selbst Folgendes anzugeben

extern string SymbolName = "USDJPY"; // Standardsymbol

Dies ist neben der Einstellung im Expert Advisor :

iCustom("USDJPY", 60, ... für dieses Paar!

Aber wenn ich diesen benutzerdefinierten Indikator für ein weiteres Paar mit anderen externen Parametern aufrufe, bedeutet das, dass ich für dieses andere Paar eine Kopie des benutzerdefinierten Indikators mit einem anderen Namen eingeben und dort auch das Symbol eines anderen Paares setzen muss!

Aber dann ist es wirklich einfacher, iMAOnArray innerhalb des Expert Advisors selbst zu berechnen, ohne eigene Indukes!

 
Das ist richtig. Trotzdem ist es eine dilettantische Angelegenheit. Ich verwende beispielsweise benutzerdefinierte Indikatoren, um eine Idee zu testen, und übertrage dann den Indikatorcode in den Expert Advisor, wenn sich die Idee bewährt hat. Dieser Ansatz garantiert praktisch, dass keine "leeren" Indikatorwerte auftreten, die schwer zu erkennen sind und bei unvorsichtiger Programmierung sehr störend sein können.
 

Vielen Dank für die Erläuterungen! Ich kümmere mich sofort darum...

klerk, an den Wochenenden habe ich Probleme mit meiner E-Mail.

Hier ist meine E-Mail Adresse für den Berater.

rid200549@ya.ru

 
alexjou:
(Опять какие-то глюки форума. В Лисе стрелки не работают, оттго и пишу не по-людски) 
Die Probleme lagen in meinem Tastaturanschluss auf der Hauptplatine. Das Forum hatte absolut nichts damit zu tun. Entschuldigung für den falschen Alarm.
 

klerk, bitte bestätigen Sie hier oder per Mail, ob Sie meine Nachricht erhalten haben.

Und noch eine Frage an die Experten (tut mir leid, wenn sie zu dumm ist):

In Multicurrency Expert Advisor -

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

Und müssen Sie diese Werte auch in die Schlusskurven der einzelnen Paare eingeben und ersetzen?

.... ...
if (OrderType()==OP_BUY)                                            {
       if (!Profit_Trailing || (Bid-OrderOpenPrice())>Trailing_Stop*Point) {
        if (OrderStopLoss()<Bid-(Trailing_Stop+Trailing_Step-1)*Point)      {
.... ....
oder kann sie so belassen werden, wie sie ist?
 
rid:

Müssen diese Werte auch in die nachfolgenden Paare eingegeben und ersetzt werden?

Ja, natürlich.