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

 
カスタムインジケータを 再描画するコマンドが見つかりません。どなたかご存知の方、教えてください。よろしくお願いします =)
 
tesla-pip:
カスタムインジケータを再描画するコマンドが見つかりません。どなたかご存知の方、教えてください。よろしくお願いします =)

もう見つけたよ。皆さん、ありがとうございました =)
 

こんにちは。

数式を出すのを手伝ってくれる?

リフィルステップのSD=100がある。

価格が25の場合、トップアウトレベルはDE=100となります。

価格が102であれば、その単価はUD=200となる

価格が215であれば、上乗せ率はBP=300となる

再び135まで下落した場合、UD=200が上値目処となる。

 
TarasBY:

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

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

ご返信ありがとうございます。しかし、すべてを理解しているわけではなく、プログラミングが苦手なため使用できません。私のインジケータコードに必要な変更を加えていただけませんか?



最初のコードはインジケーター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:
ご返答ありがとうございました。しかし、すべてを理解しているわけではなく、プログラミングも苦手なため、使用できません。

あなたが「遊んでいる」ことを、私が代わりにやってあげなさいということですね。申し訳ないが、興味はない。

また、プログラミングを学んでいる方にとっては、面白い作業だと思います。

 
皆さん、ごきげんよう。CurrencyPowerMeter」のインジケータが、ターミナルウィンドウの別の位置に移動できないのですが、どうすればよいですか?もしお手伝いいただけるのであれば、とてもうれしいです。
 
もしかしたら、教えてもらえるかもしれないと思い、質問することにしました。私はインジケータを書いていて、インジケータではティックタイムフレーム(独立して開く、この1)のティックを処理しています。私のバッファ配列は、すべてのtickを処理するのではなく、選択的に(例えば60秒ごとに、しかしそれは必要ない)処理します。の代わりに
int    counted_bars=IndicatorCounted();

私は、以下の構成を理解しています。

extern int sec=60;//объявляем количество секунд
int i;//будет индексом текущей "свечи" (тика)
int i_prev;//будет индексом предыдущей "свечи" (тика), отстоящего от теущего на sec секунд назад
double MyBuffer[];//этот будет на чарте
double MyTemp[];//этот только для подсчётов

int init(){
   IndicatorBuffers(2);
   SetIndexBuffer(0,MyBuffer)
   SetIndexBuffer(1,MyTemp)
   SetIndexDrawBegin(0,14);
   i=Bars-1;
   while(Volume[i]-Volume[Bars-1]<sec) i--;//потому что в Volume[] на тиковом у нас время сервера точностью до секунды (а в Time[] - моделируемое для предоставления тиков на чарте)
   i_prev=Bars-1;//отошли от первого исторического тика на чарте на заданное количество секунд, запомнили его, запомнили первый, уходим в start()
   return(0);
}

int start(){
   double deltaHigh,deltaLow;
   int counted_bars=IndicatorCounted();//честно говоря, не уверен, т.к. считаем мы не все "свечи" (тики)
   if(counted_bars>=i) i=Bars-counted_bars-1;//аналогично
   while(i>=0){//цикл обработчика
      deltaHigh=High[i]-High[i_prev];//к примеру
      deltaLow=Low[i_prev]-Low[i];
      //и дальше код обработчика (формируем предварительный массив MyTemp[]). В конце цикла:
      i_prev=i;//запоминаем теперь текущий индекс как индекс предыдущего тика
      while(Volume[i_prev]-Volume[i]<sec){//и уходим вперёд на заданное количество секунд
         i--;
      }
   }
...

さて、問題です。純粋なM1バージョンでは、次のようなことが標準装備されています。

   if(counted_bars>0) counted_bars--;
   int limit=Bars-counted_bars;//принтовал, при первом обращении limit=Bars-2, при последующих limit=2
   for(i=0; i<=limit; i++){
      MyBuffer[i]=iMAOnArray(MyTemp, 0, 14, 0, MODE_EMA, i);

limitとcounted_barsを何に置き換えるか?私の理解では

int counted_bars=ArraySize(MyTemp)-1;//сразу после цикла while

(60秒間のティック数は一定ではないので、int counted_bars=IndicatorCounted()/_number_of_tics_in_60_seconds_ とだけ書いてもうまくいかない).

それとも、私がすべてにおいて間違っているのでしょうか?

p.s. 想定される質問を前に、お答えします。FXではsec!=60は適用できず、sec=60は意味がないことは知っていますが、私はFXでも取引はしていません。

 
MK07:
ご返信ありがとうございます。しかし、すべてを理解しているわけではなく、プログラミングも苦手なので使えません。私のインジケータコードに必要な変更を加えていただけないでしょうか?
すみません、車をお持ちですか?持っている人は、贅沢品とは思わず、必要なものだと考えているのではないでしょうか?そうでなくても、一生そのままにしておくわけではないのでしょう?この時代だから、車の運転は知っておかないと。私はただの農家ですが、やることはやっています。私にとってプログラミングは庭仕事と変わりませんし、鍵屋の仕事と同じ、手を動かす仕事です(私は田舎に住んでいます)。一輪車も、一輪車も、MQL4も、私にとってはただの道具です。都会に住んでいる人は認識が違うのかもしれませんが、私は知りません。マニュアルのグローバル変数はこちら、標準のファイル関数はこちら、高速なものはこちら、でもWinAPIを通して。昨日、回答したかったのですが、しませんでした。
 

皆さん、こんにちは。

配列の使い方を勉強中です。

配列があり、文字列で初期化されています。 };

そして、プログラムはその配列を読み込んで実行した。

同じ配列を1つのカラムに初期化しました。

ダブルマッシ[3567]

{

mass [ 0] = 0.85374;
mass [ 1] = 0.85694;
質量[ 2] = 0. 85974;
質量[ 3] = 0.86174;
mass [ 4] = 0.86474;
mass [ 5] = 0.86494;
mass [ 6] = 0.86504;

mass [ 7 ] = 0.86524となります。

}

コンパイラは エラーを発生させず、警告を発生させます

'{' - expression on global scope not allowed C:\Program FilesAlpari NZ MT4(2)\expertsinclude゙MASSIV.mqh (4, 2)

配列は以前(文字列で初期 化して問題なく動作していた時)と同様にグローバルに宣言されています。

 #include <MASSIV.mqh> 


 
int start()
{
 double Price=iOpen (Symbol (),0,0);         
 double SL=NormalizeDouble (Price+3000*Point, Digits);         
 double TP=NormalizeDouble (Price-100*Point, Digits);   

 double value =  Bid ;//параметру value функции ArrayBsearch присваивается значение  цены последнего тика
 double ld_Delta = 0.0010;
 int S = ArrayBsearch(  mass,  value, WHOLE_ARRAY,  0, MODE_ASCEND);//функция возвращает индекс значения цены макс. близкой к цене последнего тика 
 

 int last_order_bar = 0;
int ot = OrdersTotal();
...............................(остальной код опустил,но он  не изменился)

ログには2つの項目しかありません。

2013.04.12 16:14:44 XXXテスト開始

2013.04.12 16:14:36 XXX EURUSD,H1: ロードに成功しました。


の質問ですが、なぜプログラムは1列で初期化された配列を読まない のでしょうか?

ありがとうございます。

理由: