MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 182

 
Artyom Trishkin:
そして、あなたはコードの一部を示していません。なぜ例を示しているのか、はっきりしません。

struct p{

double trailingProfit;

int orders[10];

bool flagOpen;// флаг , указывающий на открытость позиции

//тут еще куча связанных параметров

};


p order[];

int OrderN=-1;


int OnInit()
  {

   ArrayResize(pair,1,1000);
 

   return(INIT_SUCCEEDED);
  }

void openOrder(price){

       OrderN++;

       int t;

       ArrayResize(orders,order+1);

      t=OrderSend(Symbol(),OP_BUYSTOP,2,(NormalizeDouble(price,Digits)),3,0,0,"pair",MAGICN,0,Blue);
      if(t==0) Print("не удалось выставить ордер BUYSTOP ", price);

      for(intj=0,j<10,++j){     

      if(orders[OrderN].orders==0) orders[OrderN].orders=t;

      break;

      }

      orders[OrderN].flagOpen=1;

}

//...... тут идет обработка позиций...

void massCut(){

// нужна вот такая функция

}

EAが長時間動作していると、配列が大きくなりすぎて処理に支障をきたすので、配列を減らす必要がある。古いクローズド・オーダーはすべて先頭にあり、最初に見つかったオープン・オーダー以降はすべて残しておく必要があります。
 
Evgenii:

...
EAを長時間稼働させていると、アレイが大きくなりすぎて処理できなくなるので、アレイを縮小する必要がある。古いクローズドオーダはすべて先頭にあり、最初に見つかったオープンオーダ以降はすべて残します。

EAを再起動すると、構造体の配列はどうなるのでしょうか?

 
Artyom Trishkin:

EAを再起動すると、構造体配列はどうなるのでしょうか?

を実行すると、配列がクラッシュしてしまうという問題があり、この問題は解決されていません。
 
Evgenii:
配列は削除されます。この問題は解決されていません。

そこにそして、これはそもそも検討すべきことだったのです。

結論は明らかで、配列をゼロにして、現在の注文とポジションの状態を再入力しなければならない。しかし、これは口座内の注文や ポジションの量の変化を捉えた場合にのみ行うべきものです。

常に現在のオーダーとポジションの状態だけが手元にあり、存在しないオーダーやポジションをわざわざ配列から排除する必要はない。そして、注文/ポジションのリストは、完全に、または履歴の一定期間、特定の場合のみ、つまりアカウント内の注文/ポジションの数が変わったときにスクロールする必要があります。

 
Alexey Viktorov:
なぜそのような倒錯が必要なのか?

再初期化のたびにonInitがスピンしないようにし、静的配列を 1つのインスタンスに縮小する...場所によっては2回書かれているため、一般にこれはリソースの最適化である
...このままにしておきます、今のところシンプルなので
 
LRA:
サイズを指定せずにグローバル配列を宣言した場合。関数は ArrayResize でサイズを設定します。そして、グローバルに可視化され、OnInitが解除される...。

配列は静的で、明確に定義された値を持つので、別に初期化する意味はありません(
 
Money_Maker:

再初期化のたびにOnInitがスピンするのを防ぎ、静的配列を 1インスタンスに減らすためです。
...今のままにしておきます。
再初期化のたびにOnOnit()でループしないように、非初期化の理由UninitializeReason()をチェックするだけで、それ以上は何も出てきませんね。静的配列を減らすとはどういうことですか?まあ、一般的には、よく分かっているのでしょう。
 
MT4テスターでは、手数料は考慮されないのですか?
 
Andrey Dik:
MT4テスターでは、手数料は考慮されないのですか?
手数料が発生するアカウントに接続していないと考慮されないようです。
 

関数Print() に関する質問です。EAでPrint()でデータに日付(日)を加えて表示させるにはどうしたらいいですか?初心者にわかりやすく、実験のために作り直したコードを入れて、あらかじめ "pivot "をインデュークしておくcbs!


コードそのものです。PivotsDaily v2.mq4


#property indicator_chart_window

#プロパティ indicator_buffers 3

#property indicator_color1 ライム

#プロパティ indicator_color2 ブルー

#property indicator_color3 レッド


//---- 入力パラメータ

extern inttern CountBars=300。

//---- バッファ

double PBuffer[];

double S1Buffer[];

double R1Buffer[];


文字列 Pivot="P", Sup1="S 1", Res1="R 1";


int fontsize=10;

double P,S1,R1,S2,R2,S3,R3;

double LastHigh,LastLow,x;

//+------------------------------------------------------------------+

//| カストマーインジケーター初期化機能

//+------------------------------------------------------------------+

int deinit()

{


ObjectDelete("Pivot")。

ObjectDelete("S1")。

ObjectDelete("R1")。

return(0)です。

}

//+------------------------------------------------------------------+

//| カスタムインジケータ初期化関数

//+------------------------------------------------------------------+

int init()

{

文字列のshort_name。


IndicatorBuffers(7)です。

//---- インジケータライン

SetIndexStyle(0,DRAW_ARROW,2,1,Lime)を設定します。

SetIndexArrow(0,158)を設定。

SetIndexStyle(1,DRAW_ARROW,2,1,Blue)を設定します。

SetIndexArrow(1,158)。

SetIndexStyle(2,DRAW_ARROW,2,1,Red)を設定します。

SetIndexArrow(2,158)。


SetIndexBuffer(0,PBuffer)を設定します。

SetIndexBuffer(1,S1Buffer)を設定します。

SetIndexBuffer(2,R1Buffer)を設定します。


//---- DataWindowとインジケータサブウィンドウのラベル名

short_name="Pivot"。

IndicatorShortName(short_name)。

SetIndexLabel(0,short_name)を設定する。

short_name="R1"。

IndicatorShortName(short_name)。

SetIndexLabel(2,short_name)を設定します。


short_name="S1"。

IndicatorShortName(short_name)。

SetIndexLabel(1,short_name)を設定します。


SetIndexDrawBegin(0,6)を設定します。

//----


return(0)です。

}

//+------------------------------------------------------------------+

//| カスタムインジケータ反復関数

//+------------------------------------------------------------------+

int start()


{

int counted_bars=IndicatorCounted();


int limit, i;

//---- インジケータ計算

if (counted_bars==0)

{

x=Period()です。

if (x>CountBars) return(-1);

ObjectCreate("Pivot", OBJ_TEXT, 0, 0,0);

ObjectSetText("Pivot", " Pivot",10, "Arial",Lime);

ObjectCreate("S1", OBJ_TEXT, 0, 0, 0);

ObjectSetText("S1", " S1",10, "Arial",Blue);

ObjectCreate("R1", OBJ_TEXT, 0, 0, 0);

ObjectSetText("R1", " R1",10, "Arial",Red);

}

if(counted_bars<0) return(-1);


limit=(Bars-counted_bars)-1。


for (i=limit; i>=0;i--)

{

if (TimeDayOfWeek(時間[i]) != 0)

{

if (High[i+1]>LastHigh) LastHigh=High[i+1];

if (Low[i+1]<LastLow) LastLow=Low[i+1];

}


もし

TimeDay(Time[i])!=TimeDay(Time[i+1]) && TimeDayOfWeek(Time[i])!=0

)

{

P=Close[i+1]とする。

R1 = LastLow;

S1 = LastHigh;

S2=High[i]-Low[i]とする。

S3=High[i]-Open[i+1];

if(S3==0)

{R2 = S3;}。else {R2 = S2/S3;}。

Print("R2 ",R2); // <= プリンタにデータを加えて日付を印刷させるにはどうしたらいいですか?


LastLow=Open[i]; LastHigh=Open[i];

ObjectMove("Pivot", 0, Time[i],P);

ObjectMove("S1", 0, Time[i],S1);

ObjectMove("R1", 0, Time[i],R1);

}

PBuffer[i]=P;

S1Buffer[i]=S1;

R1Buffer[i]=R1;

}

//----

return(0)です。

}