エラー、バグ、質問 - ページ 1189

 

meta-quotesさん、完全に勘違いしてますね(

bool  ObjectCreate(
   long         chart_id,      // идентификатор графика
   string       name,          // имя объекта
   ENUM_OBJECT  type,          // тип объекта
   int          sub_window,    // индекс окна
   datetime     time1,         // время первой точки привязки
   double       price1,        // цена первой точки привязки
   ...
   datetime     timeN=0,       // время N-ой точки привязки
   double       priceN=0,      // цена N-ой точки привязки
   ...
   datetime     time30=0,      // время 30-й точки привязки
   double       price30=0      // цена 30-точки привязки
   );
 

N after 30 first ?

最大30本?

 
sanyooooook:

meta-quotesさん、完全に勘違いしてますね(

N after 30 first ?

最大30本?

ヘルプに明記されています。

指定された名前、型、初期座標を持つオブジェクトを、指定されたグラフのサブウィンドウに作成する。作成時に座標を30個まで指定することができます。

すなわち、30が最大である。そのため、最初に未知数(N)のパラメータが来て、一番最後のパラメータがインデックス30となる。

 
barabashkakvn:

ヘルプに明記されています。

指定された名前、型、初期座標を持つオブジェクトを、指定されたグラフのサブウィンドウに作成する。作成時に最大30個の座標を指定することができます。

すなわち、30が最大である。そのため、最初に未知数(N)のパラメータが来て、一番最後のパラメータがインデックス30となる。

通常はNと書き、その後にN<=30となる最大数Nを指定する。

SZZ: 彼らは混乱の達人です。配列をコピー する際にインデックスを変更するだけで、何のコストもかかりません )

またはこれ

           ObjectSetInteger(0,iObjectName,OBJPROP_TIME,0,X1Time);

トレンドラインの最初の座標は1番目ではなく、0番目であることが判明しました。少なくとも、この情報をすぐに見つけられるような場所には、そんなことは書いてありません。

 
sanyooooook:
通常Nと書き、その後にN<=30で最大のNを指定します。

この文脈ではありません。これは条件の記述ではなく、変数名である。また、変数名には許容される最大のインデックスを反映させる必要があります。そのため、最後の変数はインデックス30で行く。

   datetime     time30=0,      // время 30-й точки привязки
   double       price30=0      // цена 30-точки привязки
 
paladin800:
ファイル操作で、ディスクではなくRAMにファイルを読み書きすることで、高速かつ穴なく動作させる方法はないでしょうか。
RAMディスクを作ることもできるし、メモリ上にファイルを作ることもできる。
 
barabashkakvn:

この文脈ではありません。これは条件の記述ではなく、変数名である。また、変数名には許容される最大のインデックスを反映させる必要があります。したがって、最後の変数は30という指数で行く。

どの数学の教科書でも、上に書いたように、Nを指定して、このNに30を超えない値を与えています。
 

四畳半の参考文献に載っているそうです。

bool  ObjectCreate(
   long          chart_id,      // идентификатор графика
   string        object_name,   // имя объекта
   ENUM_OBJECT   object_type,   // тип объекта
   int           sub_window,    // индекс окна
   datetime      time1,         // время первой точки привязки
   double        price1,        // цена первой точки привязки
   ...
   datetime      timeN=0,       // время N-точки привязки
   double        priceN=0       // цена N-точки привязки
   );
 

 
TheXpert:
RAMディスクを作ることもできるし、メモリ上にファイルを作ることもできる。
なるほど。問題は、ターミナルのサンドボックスがCドライブにあり、RAMドライブ(例えばEドライブ)を作成しても、そこにサンドボックスをリダイレクトすることができないことです。
 
paladin800:
なるほど。問題は、ターミナルのサンドボックスがCドライブにあり、RAMドライブ(例えばEドライブ)を作成しても、そこにサンドボックスをリダイレクトできないことです。

まず、リダイレクトが可能であること。

また、WinAPIを使用する場合は、リダイレクトも必要ありません。次に、WinAPIも必要ですが、メモリ上のファイル作成はRAM-diskとは関係ありません。

 

Metaeditorのヘルプを 利用して、見開きで作業する例をとってみました。GBPCHF、CADCHFのスプレッドが1-2pipsもないもので動かしてみました。配列がゼロで埋め尽くされている理由を教えてください。そのような設計になっているのでしょうか?

#property indicator_separate_window
#property indicator_buffers 1
//---- plot Spread
#property  indicator_label1  "Spread"
#property  indicator_type1   DRAW_HISTOGRAM
#property  indicator_color1  clrRed
#property  indicator_style1  STYLE_SOLID
#property  indicator_width1  1
//--- input parameters
input int      bars=3000;
//--- indicator buffers
double         SpreadBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,SpreadBuffer,INDICATOR_DATA);
   IndicatorSetInteger(INDICATOR_DIGITS,0);
//---
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[])
  {
//---
   if(prev_calculated==0)
     {
      int spread_int[];
      ArraySetAsSeries(spread_int,true);
      int spreads=CopySpread(Symbol(),0,0,bars,spread_int);
      Print("Получено исторических значений спреда: ",spreads);
      for (int i=0;i<spreads;i++) 
      {
      SpreadBuffer[rates_total-1-i]=spread_int[i];
      if(i<=30) Print("spread["+i+"] =",spread_int[i]);
      }
     }
   else
     {
      double Ask,Bid;
      Ask=SymbolInfoDouble(Symbol(),SYMBOL_ASK);
      Bid=SymbolInfoDouble(Symbol(),SYMBOL_BID);
      Comment("Ask = ",Ask,"  Bid = ",Bid);
      SpreadBuffer[rates_total-1]=(Ask-Bid)/Point();
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }