[ARCHIVE]フォーラムを乱立させないために、どんなルーキーの質問でも。プロフェッショナルの皆さん、通り過ぎないでください。あなたなしではどこにも行けない - 5. - ページ 279

 

私の関数が同じ配列の要素の値を返すのは何か変です。この問題に関して、順を追って説明します。

グローバル 変数は

extern int i_TF = 0;
int g_maPeriod[3] = {6, 25, 150, 250},             // Периоды обрабатываемых МА
    g_singMa[3] = {1,2,3,4};                     // признаки машек, добавляемые к основному мэйджику

// Идентификаторы сигналов
#define SIGNAL_BUY           0                                 // Сигнал на покупку
#define SIGNAL_SELL          1                                 // Сигнал на продажу
#define SIGNAL_NO           -1                                 // Сигнала нет

#define CROSS_UP             0                                 // Признак нахождения быстрой средней
                                                               // ..над медленной
#define CROSS_DN             1                                // Признак нахождения медленной..
                                                               // ..средней над быстрой
#define CROSS_NO            -1                                 // Признак равенства двух средних
int crossDir[3];

この計算で使用される関数。

//+-------------------------------------------------------------------------------------+
//| Получение значений МА на двух соседних барах                                        |
//+-------------------------------------------------------------------------------------+
double GetCurAndPrevMA(int maPeriod, double& prevMA)
{
   prevMA = iMA(NULL, i_TF, maPeriod, 0, MODE_EMA, MODE_CLOSE, 1);
   return (iMA(NULL, i_TF, maPeriod, 0, MODE_EMA, MODE_CLOSE, 0));
}
//+-------------------------------------------------------------------------------------+
//| Получение положения машек между собой                                               |
//+-------------------------------------------------------------------------------------+
void GetStateMa(int& crossDir[])
{
   double ema365_1;
   double ema365_0 = GetCurAndPrevMA(365, ema365_1);

   Print("g_maPeriod[0] = ", g_maPeriod[0]);
   Print("g_maPeriod[1] = ", g_maPeriod[1]);
   Print("g_maPeriod[2] = ", g_maPeriod[2]);
   Print("g_maPeriod[3] = ", g_maPeriod[3]);
   
   for (int i=0; i<4; i++)
   {
      double ema1;
      double ema0 = GetCurAndPrevMA(g_maPeriod[i], ema1);

      crossDir[i] = CROSS_NO;

      Print("ema1 < 365_1 ", ema1 ," < ", ema365_1);
      if (ema1 < ema365_1 && ema0 > ema365_0)
      {
         Print("ema1 < 365_1 ", ema1 ," < ", ema365_1);
         crossDir[i] = CROSS_UP;
      }
      if (ema1 > ema365_1 && ema0 < ema365_0)
      {
         Print("ema1 > 365_1 ", ema1 ," > ", ema365_1);
         crossDir[i] = CROSS_DN;
      }
   }
}

さらに、GetStateMa(int& crossDir[]) 関数が返す配列アイテムの値を表示しています。

   Print("crossDir[0] = ", crossDir[0]);
   Print("crossDir[1] = ", crossDir[1]);
   Print("crossDir[2] = ", crossDir[2]);
   Print("crossDir[3] = ", crossDir[3]);

これが返ってくるのです。

2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: crossDir[3] = 0
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: crossDir[2] = -1
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: crossDir[1] = -1
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: crossDir[0] = -1
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: open #1 buy 0.10 EURUSD at 1.29654 ok
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: ema1 < 365_1 1.3129 < 1.3225
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: ema1 < 365_1 1.3017 < 1.3225
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: ema1 < 365_1 1.2886 < 1.3225
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: ema1 < 365_1 1.2916 < 1.3225
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: g_maPeriod[3] = 250
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: g_maPeriod[2] = 150
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: g_maPeriod[1] = 25
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: g_maPeriod[0] = 6

配列要素crossDir[] の値はすべて値1 であるべきですが、異なる値が返されます。

これは、マッハ4と365を比較したときの表記の崩れからわかります。値が正しく返されない理由を教えてください。

 
Ekburg:


というのも、送られてきたリンク先ではこのアレイについて特に触れられていなかったし、仕事中だったので左の欄は気にしていなかったからです。

しかし、あなたが吐き出したものは、あなた以外誰も飲み込まないでしょう ;)


ヒントからどのように学んだのでしょうか?積極的で探究心のある自習だけが実を結ぶのです噛み砕いたのに、的確なアドバイスに「吐き戻し」!?ベビーシッターに片付けを頼む!?
 
iCustomで インジケータAから インジケータBを 作成し、チャート上に 表示しています。 インジケータAの パラメータを変更すると、インジケータBが 自動的にリビルドされず、強制的に再コンパイルする必要があります。 なぜインジケータBは 自動的にリビルドされないのですか? 私の間違いが何であるかアドバイスをお願いします。
 
MK07:
皆さんこんばんは インジケータAから インジケータBを ビルドしています(iCustomを通して )。 両方のインジケータがチャート上にあります。 インジケータAの パラメータを変更すると、インジケータBが 自動的にリビルドされず、強制的にリコンパイルする必要があります。 なぜインジケータBは 自動的にリビルドされないのですか? 私の間違いを教えてください。
インジケータAの 設定とはINDEPENDENTな特定の設定でインジケータAをiCustom 経由で)呼び出すと、ターミナルが同時に2つの独立したインジケータAのコピーを計算することを意味します。
 
TarasBY:
iCustomで インジケータAを 呼び出し、その設定はインジケータAの 設定には依存しません。

端末が指標Aの 2番目のバリエーションを計算するようにするには、どうしたらよいでしょうか。
 
MK07:
端末で第二版の指標Aを 計算させるためにはどうしたらよいでしょうか。
課題をより具体的にする。
 
borilunad:

プロンプトから学んだとすれば、どのように学んだのでしょうか?積極的で探究心のある自習だけが実を結ぶのです噛み砕いたのに、的確なアドバイスを吐き出している!?ベビーシッターに片付けを頼む!?

エゴをほどほどに!私はそのアドバイスを跳ね返さず、受け止め、お礼を言いましたが、そのような受け取り方はしません!私は文明的な方法で尋ね、答えました。
 

こんにちは。

Point 変数の 値を EA で使用する必要があります。

しかし、それは0に等しい。

私が理解する限り、これは引用符の小数点以下が5桁であるためです。

この値を決定する方法はありますか?

ありがとうございます。

 
TarasBY:
課題を明確にしてください。

指標A - 通常のAO(My_AO) - 写真の一番上のもの。

AOインジケーター(My_AO)のインジケーターB-ヒストグラム(+1/-1)-図中の真ん中のもの。

インジケータA (写真一番下)のパラメータを変更した場合、インジケータBは 再コンパイルしても変化しません。

指標でどうなるかを説明するためだけに、2つのAO指標(My_AO)を同時に表示しましたが、実際の条件ではAO(My_AO)は1つであるべきです。



最初のコードはインジケーターA です。

2つ目のコード-インジケータB

//---- indicator settings
#property  indicator_separate_window
#property  indicator_buffers 3
#property  indicator_color1  Black
#property  indicator_color2  Green
#property  indicator_color3  Red
#property  indicator_width2  2
#property  indicator_width3  2
#property  indicator_level1 0.0

//---- input parameters
extern int FastPeriod =5;
extern int LowPeriod  =34;
//---- indicator buffers
double     ExtBuffer0[];
double     ExtBuffer1[];
double     ExtBuffer2[];



//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   //---- drawing settings
   SetIndexStyle(0,DRAW_NONE);
   SetIndexStyle(1,DRAW_HISTOGRAM);
   SetIndexStyle(2,DRAW_HISTOGRAM);
   IndicatorDigits(Digits+1);
   SetIndexDrawBegin(0,34);
   SetIndexDrawBegin(1,34);
   SetIndexDrawBegin(2,34);
//---- 3 indicator buffers mapping
   SetIndexBuffer(0,ExtBuffer0);
   SetIndexBuffer(1,ExtBuffer1);
   SetIndexBuffer(2,ExtBuffer2);
//---- name for DataWindow and indicator subwindow label
   IndicatorShortName("My_AO");
   SetIndexLabel(1,NULL);
   SetIndexLabel(2,NULL);
//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//| Awesome Oscillator                                               |
//+------------------------------------------------------------------+
int start()
  {
      
  
   int    limit;
   int    counted_bars=IndicatorCounted();
   double prev,current;
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
//---- macd
   for(int i=0; i<limit; i++)
      ExtBuffer0[i]=iMA(NULL,0,FastPeriod,0,MODE_SMA,PRICE_MEDIAN,i)-iMA(NULL,0,LowPeriod,0,MODE_SMA,PRICE_MEDIAN,i);
//---- dispatch values between 2 buffers
   bool up=true;
   for(i=limit-1; i>=0; i--)
     {
      current=ExtBuffer0[i];
      prev=ExtBuffer0[i+1];
      if(current>prev) up=true;
      if(current<prev) up=false;
      if(!up)
        {
         ExtBuffer2[i]=current;
         ExtBuffer1[i]=0.0;
        }
      else
        {
         ExtBuffer1[i]=current;
         ExtBuffer2[i]=0.0;
        }
        
       
     }
//---- done
   return(0);
  }
#property indicator_separate_window
#property indicator_minimum -1.5
#property indicator_maximum 1.5
#property indicator_buffers 2
#property indicator_color1 Green
#property indicator_color2 Red
#property  indicator_width1  2
#property  indicator_width2  2
#property indicator_level1 0.0

//--- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_HISTOGRAM);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexStyle(1,DRAW_HISTOGRAM);
   SetIndexBuffer(1,ExtMapBuffer2);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {  
      
       
    double UP,DN;     
  
  
    int counted_bars=IndicatorCounted(),
       limit;  
       
    if(counted_bars>0)
      counted_bars--;
   
      limit=Bars-counted_bars;
//----
   for(int i=0;i<limit;i++)
       
      { 
        UP=iCustom(NULL,0,"My_AO",1,i+1);               
        DN=iCustom(NULL,0,"My_AO",2,i+1);    
             
        
       if(UP>0)       
         {ExtMapBuffer1[i+1]=1;
          ExtMapBuffer2[i+1]=0;
         }
         
       if(UP<0)       
         {ExtMapBuffer1[i+1]=-1;
          ExtMapBuffer2[i+1]=0;
         }  
         
                              
       if(DN>0)            
         {
          ExtMapBuffer1[i+1]=0;
          ExtMapBuffer2[i+1]=1;
         }
              
       if(DN<0)            
         {
          ExtMapBuffer1[i+1]=0;
          ExtMapBuffer2[i+1]=-1;
         }
               
                       
    
    }
//----
   return(0);
 
   }
   
//+------------------------------------------------------------------+    
   
        
        
 
MK07:

インジケータA- 通常のAOインジケータ(My_AO)-上図。

指標B- AO指標(My_AO)のヒストグラム(+1/-1)-図中の中央。

インジケータA (図中下)のパラメータを変更した場合、リコンパイルしてもインジケータBは 変わりません。

2つのAOインジケータ(My_AO)を同時に表示したのは、インジケータで何が起こるかを説明するためだけですが、現実にはAO(My_AO)は1つであるべきなのです。

最初のコードはインジケーターA です。

2つ目のコードは、インジケーターB です。

そして、この順番が普通なのです(これが端末の原理です)。

指標Aの パラメータを変更したい場合、指標間の情報交換を行います(ファイル、端末のグローバル変数、RAMでも可)。指標Aは 初期化時に初期化可能なパラメータを渡し、指標Bは 指標Aの 変更を定期的にチェックします。変更を検出したら、指標Bも 新しいパラメータで初期化します(強制init())。