ライブラリ: 時系列 - 時系列での作業のための関数ライブラリ - ページ 2

 

一般的に、私はこのような動きに対して二重の態度を持っている。

一方では、彼は懸命に働き、投稿したことを後悔していない、 称賛と敬意.

一方、それはlabuhovs愚かにもMT4からMT5にコードを移植するために必要である。"愚かにも "とは、言語の可能 性に踏み込むことなく、戦略そのものを掘り下げることなくという意味である。

ちなみに、私自身は今これをやっています :)というわけで、批判は私に向けられたものです。

MQL5の愚かさと可能性について詳しく説明しよう。

iCloseという単純な関数を例にとると、MT4では時系列全体を一度に取得することはできませんでしたが(断片的にしか取得できません)、MT5では1つの値をコピーするのと時系列全体をコピーするのとで違いがないように最適化されています(少し大げさですが、ほぼそうです)。そのため、データがコピーされる配列を整理するのに同等の時間がかかることが多く、クローズを1つずつ受け取るのは意味がありません。さらに、これらの系列はすでにデフォルトでインジケータに存在しています。したがって、移植する際には、コードを計算コード(インジケーターにコピーされる)と取引コード(Expert Advisorで実行される)に分割するのが理にかなっています。

一方では、このようなコードは初心者にとって便利であり、生活しやすくなります。

一方では、Gを使ったプログラミングという間違ったプログラミングの基準を設定している。

ところで、includnikにはもう一つ機能がある:

// インクルーシブにある
MqlTick last_tick;
#define Ask last_tick.ask
#define Bid last_tick.bid
// OnTickにある
SymbolInfoTick(_Symbol,last_tick);
// これでどこでも使える
 Ask; // и
 Bid;
 

もっと洗練されたものがここにある。

しかし、標準的な聖書に基づいてすべてを書き直した方がいいだろう。

ファイル:
 
申し訳ございませんが、間違ったコードがありますか?MQL4からMQL5への移行
 
BoraBo:
すみません、コードが間違っていませんか?MQL4からMQL5への切り替え。

MQL4からMQL5への切り替えについて、

しかし、そこにはコードはなく、enumだけが壊れています。

+ 私はOrderSendを移植したのですが、問題の大部分はオーダーの設定に関するものだと思います。

例えば、取引機能全体が壊れているわけではありません(私が作ったのはOrderSendとOrderCloseだけです)。

だから、マニアには開発の余地がある。

 
Urain:

ただ、記事のコードとこのライブラリのコードがほとんど同じなので、記事の何かが間違っているのではないかと思ったんだ。

 
BoraBo:

ただ、記事のコードとこのライブラリのコードがほとんど同じなので、記事の何かが間違っているのではないかと思ったんだ。

しかし、なぜ自転車を発明したかというと、すでにそこにあるものをコピーし、編集し、自分のものを加えたからだ。

ほら、すべてうまくいった。

だからソースが公開されるんだ。

そうでなければ、すべてのプログラマーがいまだにアセンブリ言語で書いていることになる。

削除済み  
komposter:

必要なすべての機能(仮想取引の会計を含む)のアナログが手に入ったら、喜んで作ります。

今、私はこれらの機能を必要としているが、既製のライブラリーを見つけることができなかった。だから自分で作らなければならなかった。

私のライブラリーは、常に改良を加えながら、もう3年ほど使っている。

興味深い点をいくつか見つけたので、実装について考えなければならない。

 
Interesting:

興味深い点をいくつか見つけましたね。

どのような興味深い点を見つけたのか、コードから教えていただけますか?
削除済み  
sergeev:
コードのヒント、どんな興味深い点を見つけましたか?

僕のよりシンプルで機能的なものもある。私はある場所にエラーチェックを入れなかった。

僕のコードの方が3~4倍大きいこともある。

追記

しかし、私のコードはMQL4により沿っているように思えます(他のバリエーションがあるかもしれません)。

削除済み  

iHighestと iOpenの例(最初の実装)として

//機能iHighest
int iHighest(string symbol, int timeframe, int type, int count=WHOLE_ARRAY, int start=0) export 
//タイプに応じて、特定の期間数における最大値のシフトを返す。 
{
//----------------------------------------------------------------------------//
//作業変数
ENUM_TIMEFRAMES TF; //ENUM_TIMEFRAMESとしての期間

double Arr[];
long Volume[];
datetime Time[];

int Result = -1; //重要度
//----------------------------------------------------------------------------//

TF = MinuteToPeriod(timeframe);

  if(start<0)  start = 0;
  if(count<=0) count = Bars(symbol,TF);
//MODE_OPEN
  if(type==MODE_OPEN)
  {
  ArraySetAsSeries(Arr,true);

  CopyOpen(symbol,TF,start,count,Arr);

  Result = ArrayMaximum(Arr,0,count) + start;
  }
//MODE_LOW
  if(type==MODE_LOW)
  {
  ArraySetAsSeries(Arr,true);

  CopyLow(symbol,TF,start,count,Arr);

  Result = ArrayMaximum(Arr,0,count) + start;
  }
//MODE_HIGH
  if(type==MODE_HIGH)
  {
  ArraySetAsSeries(Arr,true);

  CopyHigh(symbol,TF,start,count,Arr);

  Result = ArrayMaximum(Arr,0,count) + start;
  }
//MODE_CLOSE
  if(type==MODE_CLOSE)
  {
  ArraySetAsSeries(Arr,true);

  CopyClose(symbol,TF,start,count,Arr);

  Result = ArrayMaximum(Arr,0,count) + start;
  }
//MODE_VOLUME
  if(type==MODE_VOLUME)
  {
  ArraySetAsSeries(Volume,true);

  CopyTickVolume(symbol,TF,start,count,Volume);

  Result = ArrayMaximum(Volume,0,count) + start;
  }
//MODE_TIME
  if(type==MODE_TIME)
  {
  ArraySetAsSeries(Time,true);

  CopyTime(symbol,TF,start,count,Time);

  Result = ArrayMaximum(Time,0,count) + start;
  }
//エラーの有無をチェックする 
  if(GetLastError()!=0)
  {
  Result = -1; //エラー時のメッセージ
  }  
//----------------------------------------------------------------------------//
return(Result);
//----------------------------------------------------------------------------//
}
/機能 iOpen
double iOpen(string symbol, int timeframe, int shift) export 
//指定したシンボルのバーのオープン値を、タイムフレームとシフトを指定して返します。
//ローカルヒストリーが空(ロードされていない)の場合、関数は0を返す。
//現在のチャートでは、建値に関する情報はOpen[]という定義済みの配列にあります。 
{
//----------------------------------------------------------------------------//
//作業変数
ENUM_TIMEFRAMES TF; //ENUM_TIMEFRAMESとしての期間

double Arr[];

double Result = 0; //重要度
//----------------------------------------------------------------------------//

ResetLastError();

  if(shift>=0)
  {
  TF = MinuteToPeriod(timeframe);

  CopyOpen(symbol,TF,0,Bars(symbol,TF),Arr);
  
    if(ArraySize(Arr)>0)
    {
    ArraySetAsSeries(Arr,true);
    Result = Arr[shift];
    } 

  }
//エラーの有無をチェックする 
  if(GetLastError()!=0)
  {
  Result = 0; //エラー時のメッセージ
  }  
//----------------------------------------------------------------------------//
return(Result);
//----------------------------------------------------------------------------//
}