どんな新人の質問でも、フォーラムを乱雑にしないように。プロフェッショナルは、通り過ぎないでください。Nowhere without you - 6. - ページ 971

 
korobok777:
コードがないとわからない
 

午後買われすぎ/売られすぎゾーンからRSIが抜けるための簡単なインジケータを書きました。

右のように、矢印を描くべき場所に描きます。ただし、リアルタイムに限る。

質問:ヒストリーにn本のバーを描画させるには?

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 LimeGreen
#プロパティ indicator_color2 LimeGreen

double rsi,rsi1,rsi2;
double CrossUp[];
double CrossDown[];
int FLAG = 0;
int FLAG1 = 2;
bool New_Bar=false;
int init()
{
//---- インジケータ
SetIndexStyle(0, DRAW_ARROW,5,1)を設定します。
SetIndexArrow(0, 233)を設定します。
SetIndexBuffer(0,CrossUp)を設定します。
SetIndexStyle(1, DRAW_ARROW,5,1)を設定します。
SetIndexArrow(1, 234)を設定します。
SetIndexBuffer(1,CrossDown)を設定します。
//----
return(0)です。
}
//+------------------------------------------------------------------+
//| カスタムインジケーター初期化関数
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
return(0)です。
}
int start()
{

rsi = iRSI(NULL,0,4,PRICE_CLOSE,0);
rsi1 = iRSI(NULL,0,4,PRICE_CLOSE,1);
rsi2 = iRSI(NULL,0,4,PRICE_CLOSE,2);



Fun_New_Bar()。
int limit, i, counter;
double Range, AvgRange;
for(i = 0; i <= limit; i++) {.
counter=iとする。
Range=0とする。
AvgRange=0。
for (counter=i ;counter<=i+9;counter++)
{
AvgRange=AvgRange+MathAbs(High[counter]-Low[counter]);
}
Range=AvgRange/10。
if (FLAG<1 && rsi<rsi2 && rsi2>70 && rsi1<70)
{アラート(「RSI DOWN!!!!on ", Symbol());
CrossDown[i] = High[i]+ Range*1.8;
FLAG = 1;}.
if(FLAG1>1 && rsi>rsi2 && rsi2<30 && rsi1>30)
{アラート(「RSI UP!on ", Symbol());
CrossUp[i] = Low[i]- Range*1.8;
FLAG1 = 1; }.
if( New_Bar==true)
{FLAG=0;}。
if( New_Bar==true)
{FLAG1=2;}。
}
return(0)です。
}
void Fun_New_Bar()
{
static datetime New_Time=0;
New_Bar=false とする。
if(New_Time!=Time[0])とする。
{
New_Time=Time[0]です。
New_Bar=true とする。
}
}
 
Vinin:
コードがないと何もわからない。
//==================================================================+
extern ENUM_TIMEFRAMES PERIOD_=PERIOD_H1;//Периоды графиков
//==================================================================+

string _ChartSymbol;
long   _ChartID,
       _ChartFirst,
       _ChartPeriod;
int start()
{//---идентификатор графика начиная с первого 
    _ChartFirst=ChartFirst();
if(_ChartFirst>0)//если идентификатор больше ноля
{
 _ChartSymbol=ChartSymbol(_ChartFirst);//символ графика
 _ChartPeriod=ChartPeriod(_ChartFirst);//Периоды графика
 //---выполним функцию конвертации периода если не совпадает
if( _ChartPeriod!=PERIOD_)
 {
  bool  ch=ChartSetSymbolPeriod(_ChartFirst,_ChartSymbol,PERIOD_);
 } 
}
return(0);
}
int  deinit()
{
Alert("скрипт закончил работу");
return(0);
}
最初のグラフだけ で、それ以上はポップアップウィンドウに阻まれてやってません。
 
Red_Manticore:

午後買われすぎ/売られすぎゾーンからRSIが抜けるための簡単なインジケータを書きました。

右のように、矢印を描くべきところに描く。ただし、リアルタイムに限る。

質問:ヒストリーにn本のバーを描画させるには?


ルールに従ってコードを 挿入し、早く知り合いになりましょう。ビデオボタン左のSRCをクリックし、"シート "を削除してください

#property indicator_chart_window
#property indicator_buffers 2
#property  indicator_color1 LimeGreen
#property  indicator_color2 LimeGreen

double rsi,rsi1,rsi2;
double CrossUp[];
double CrossDown[];
int FLAG = 0;
int FLAG1 = 2;
bool New_Bar=false; 
 
int init()
  {
//---- indicators
  SetIndexStyle(0, DRAW_ARROW,5,1);
   SetIndexArrow(0, 233);
   SetIndexBuffer(0, CrossUp);
   SetIndexStyle(1, DRAW_ARROW,5,1);
   SetIndexArrow(1, 234);
   SetIndexBuffer(1, CrossDown);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 

//----
   return(0);
  }
int start()
{  

rsi = iRSI(NULL,0,4,PRICE_CLOSE,0);
rsi1 = iRSI(NULL,0,4,PRICE_CLOSE,1);
rsi2 = iRSI(NULL,0,4,PRICE_CLOSE,2);



Fun_New_Bar(); 
  
   int limit, i, counter;
   double Range, AvgRange;
    for(i = 0; i <= limit; i++) {
   
      counter=i;
      Range=0;
      AvgRange=0;
      for (counter=i ;counter<=i+9;counter++)
      {
         AvgRange=AvgRange+MathAbs(High[counter]-Low[counter]);
      }
      Range=AvgRange/10;
      if (FLAG<1 && rsi<rsi2 && rsi2>70 && rsi1<70)
      {Alert ("RSI DOWN!!! on ", Symbol());
      CrossDown[i] = High[i]+ Range*1.8;
          FLAG = 1;} 
      if(FLAG1>1 && rsi>rsi2 && rsi2<30 && rsi1>30)
      {Alert ("RSI UP!!! on ", Symbol());
      CrossUp[i] = Low[i]- Range*1.8;
         FLAG1 = 1; } 
   
       if( New_Bar==true)
       {FLAG=0;}
       if( New_Bar==true)
       {FLAG1=2;} 
   
   }
  return(0);
  } 
  
  void Fun_New_Bar()                              
  {                                             
   static datetime New_Time=0;                  
   New_Bar=false;                               
   if(New_Time!=Time[0])                        
     { 
      New_Time=Time[0];                         
      New_Bar=true;                            
     } 
  }     
ответить
 
korobok777:
これは最初のチャートのみで、それ以上のポップアップウィンドウの妨害はしていません。

スクリプトは、開いている すべてのチャートを処理します。現在のものが最後に処理されます。タイムフレームを変更するとスクリプトが終了するため、スクリプト終了の警告ウィンドウは一度だけ表示されます。すべてのチャートで、タイムフレームが指定したものに変更されます

//+------------------------------------------------------------------+
//|                                             ReplaceTimeFrame.mq4 |
//|                                            Copyright 2015, Vinin |
//|                                             http://vinin.ucoz.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, Vinin"
#property link      "http://vinin.ucoz.ru"
#property version   "1.00"
#property strict

#property  show_inputs

input ENUM_TIMEFRAMES PERIOD_=PERIOD_H1;//Периоды графиков

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
   long id=ChartFirst();
   long id_current=ChartID();
   int i=0;
   while(i<100)
     {
      ENUM_TIMEFRAMES _ChartPeriod=ChartPeriod(id);//Периоды графика
      if(_ChartPeriod!=PERIOD_ && id!=id_current)
        {
         bool  ch=ChartSetSymbolPeriod(id,ChartSymbol(id),PERIOD_);
        }

      id=ChartNext(id);
      if(id<0){break;}
      i++;
     }
   ENUM_TIMEFRAMES _ChartPeriod=ChartPeriod(id_current);//Периоды графика
   if(_ChartPeriod!=PERIOD_)
     {
      bool  ch=ChartSetSymbolPeriod(id_current,ChartSymbol(id_current),PERIOD_);
     }
  }
 
Vinin:

スクリプトは、開いているすべてのチャートを処理します。現在のものが最後に処理されます。タイムフレームを変更するとスクリプトが終了するため、スクリプト終了の警告ウィンドウは一度だけ表示されます。すべてのチャートで、タイムフレームが指定されたものに変更されます。


Ai))よくやった!!!ありがとう!!!!
 

こんにちは。

配列を宣言する

double gdClose_array[]。

ArrayResize(gdClose_array, 1)を使用します。

現在のチャートから、最後に閉じたバーを持つ配列にデータをコピーします。

iX=CopyClose(Symbol(),PERIOD_CURRENT,1,1,gdClose_array) ;

配列の出力値

double dX=NormalizeDouble(gdClose_array[0],Digits);

Print ("NormalizeDouble(dX,Digits) ", dX);

数字が出るが、明らかに間違っている。

NormalizeDouble(dX,Digits) 1.0644.

チャートにはそのような値はないものの(可視化により)

そして、この値はテストの過程で変わることはない。

を追加しました。

ArraySetAsSeries(gdClose_array,true)です。

の状況は変わらなかった。

どこにエラーがあるのか?

 
n0name:

午後

...

現在のチャートから、最後に閉じたバーによるクローズでデータを配列にコピーする。

iX=CopyClose(Symbol(),PERIOD_CURRENT,1,1,gdClose_array) ;

ここでは、配列の要素の インデックスを指定せずに、配列の名前だけを書いています。先にArrayResize(gdClose_array, 1); で配列の要素数を1にしているので、そのインデックスは0です。だからこそ、この方法でなければならないのです。

iX=CopyClose(Symbol(),PERIOD_CURRENT,1,1,gdClose_array[0]);


あと、いくつか質問・ヒントがあります。

1) 1つの値だけを格納する必要がある場合、配列の代わりに変数を使用することができます。では、代わりに

double gdClose_array[];
ArrayResize(gdClose_array, 1); 

作る

double gdClose_array;

で、あとは元のコードと同じようにやってください。

2) 配列が必要だが、要素が1つしかないことがすぐにわかる場合、動的な配列を宣言してサイズを変更するのではなく、要素が1つの静的な配列を宣言すること。余分な操作は必要ないのです。

の代わりに

double gdClose_array[];
ArrayResize(gdClose_array, 1);

書く

double gdClose_array[1];

では

iX=CopyClose(Symbol(),PERIOD_CURRENT,1,1,gdClose_array[0]);

で、元のコードと同じように

 

こんにちは、プログラマーの方に質問です。

Expert Advisor を使用していますが、注文が開始されるとトリガーされ、指定されたポイント数に応じてストップロスとテイクプロフィットが配置されます。

私の質問です。

ストップロスの代わりに、EAが同じサイズの保留中の逆指値注文 を公開するようにコードを変更することはできますか?

そのためには、コードのどこを変えればいいのでしょうか?

ありがとうございます。

 

こんにちは。

なぜ、ヘルプに書いてある通りになっているのに、結果が0.0と表示されるのでしょうか?

  double FractalDown_1 = iFractals(NULL,0,MODE_LOWER,1); Print("FractalDown_1=",FractalDown_1);

なぜ、フラクタル値が抽出されないのでしょうか?