コーディングの方法は? - ページ 271

 

iCustom関数でカスタムインジケータを呼び出すことができるEAにヘルプが必要です。

こんにちは、皆さん。

このEA(swb grid 4.1.0.3_EA)に、この(Entry.mq4)インディケータをiCustom関数で追加したいのです。

iCustom関数で追加し、EAのストラテジーでこのインディケータを使用できるようにしたいです。

このEAはすでにボリンジャーバンド、ストキャスティクス、RSIの3つのMT4インディケータを使用していて

TRUEまたはFALSEを選択することで、そのうちのいずれか、またはすべてを使用するように選択することができます。

この4つ目のインジ(Entry.mq4)をEAに追加したいのですが。

どなたかご教授いただければ幸いです。

ありがとうございました。

EAとindiは以下に添付しています。

ファイル:
 

この配列を理解するためにMQL4初心者のヘルプが必要です。

こんにちは、コーダー

配列について教えていただける方はいらっしゃいませんか?

というか、この配列に関係するループを理解するのに苦労しています。

int i=Bars;

#property copyright "Unfinished POS by Agent86"

double v1[];

ダブルv2[]。

double val1;

double val2;

int start()

{

while(i>=0)

{

val1=iFractals(NULL, 0, MODE_UPPER,i);

if (val1 > 0)

{

v1=High。

}

さもなくば

{

v1=v1。

}

val2=iFractals(NULL, 0, MODE_LOWER,i);

if (val2 > 0)

{

v2=Low。

}

else v2=v2;

i--;

}

return(0);

}

基本的なフラクタルなのに、配列のどの要素も参照できないようです。

なんとかi++をインクリメントしてPrint(v1);するか、0やEMPTY_VALUEの 前の値を表示できるようにしたいのですが、どうしたらいいでしょうか?

もし、これで正しい方向に進んでいるのであれば。

私は困っています。

Print (v1): 常に == 0 で、0を表示する。

実際には-1までループしているため、==0であることはなんとなくわかるのですが

私は何が起こっているかを見ることができるように、どのように、どこにPrintステートメントを置くことができますか?

多くのメソッドを試し、i=0を再初期化してv1要素を参照できるような代替ループを試みましたが、すべての試みは失敗しました。

基本的に、私はABCDスキームタイプのEAで将来使用する可能性があるために、以前のフラクタルを表示したり、A high、B lowなどのようにマークしたいです。

今のところ、主にv1をプリントして、何をしているのかが分かるようにしたい。

おそらく、私はA_highやB_lowのような以前のフラクタルまたはそのようなスキームを選択するために何かを設計するかもしれません。

私はこれで間違った軌道に乗るのでしょうか?

アドバイスお願いします。

ありがとうございます。

 

私なら、FORループにします。whileループは、i--を含むことを忘れると、ロックアップにつながる可能性があります。正確なバーの 数を知っているため、使いやすく、さらにiが< 0になることはありません。

For (int i=Bars-1;i>0;i--){。

// コード

}

配列の値をすべて0にしてから、もう一度インジケータの値を代入してみてください。また、インジケータ値を代入した後、直接print()を試してみてください。実際に何かを返しているかどうか見てみましょう。

私の推測では、あなたの最善の策は、実際に配列にサイズを割り当てることです。例えば、1000ポジション。それほどの数は必要ないでしょうし、計算量も少なくなります。あとは、過去999本のバーを0までループして値を割り当てるだけです。MT4は配列の初期化とかで問題があるように記憶しています。

 

配列に関する質問

Trader5050-Deployed:
私なら、FORループを使います。whileループは、i--を含むことを忘れると、ロックアップにつながる可能性があります。あなたはバーの正確な数を知っているので、それは使いやすく、さらにiは決して< 0になることはありません。

For (int i=Bars-1;i>0;i--){。

// コード

}

配列の値をすべて0に設定し、その後、インジケータ値を割り当ててみてください。また、インジケータ値を割り当てた後、直接print()を試してみてください。実際に何かを返しているかどうか見てみてください。

私の推測では、あなたの最善の策は、実際に配列にサイズを割り当てることです。例えば、1000ポジション。それほどの数は必要ないでしょうし、計算量も少なくなります。あとは、過去999本のバーを0までループして値を割り当てるだけです。MT4は配列の初期化とかで問題があるように記憶しています。

OK、ありがとうございます、やってみます。

while文はうまくいっていますが、print/viewなどしたい配列の 要素を取得するのに役立っていません。

あなたが言ったことに取り組んで、いくつかのテストをして、また投稿します。

ありがとうございます。

 
Trader5050-Deployed:
私なら、代わりにFORループを使います。whileループは、i--を含むことを忘れると、ロックアップにつながる可能性があります。バーの正確な数がわかっているので、使いやすいし、i が < 0 になることはありませんから、混乱を避けることができます。

For (int i=Bars-1;i>0;i--){。

// コード

}

配列の値をすべて0にしてから、もう一度インジケータ値を代入してみてください。また、インジケータ値を割り当てた後、直接print()を試してみてください。実際に何かを返しているかどうか、確認してみてください。

私の推測では、あなたの最善の策は、実際に配列にサイズを割り当てることです。例えば、1000ポジション。それほどの数は必要ないでしょうし、計算量も少なくなります。あとは、過去999本のバーを0までループして値を割り当てるだけです。MT4は配列の初期化とかで問題があるように記憶しています。

まだ、配列のすべてのエントリーが0であることを表示しているだけです。

おかしいな

 

Argent86です。

あなたのコードには、いくつかのエラーがあります。

- 使用している配列はまだ配列ではありません(コード内で行ったように配列サイズを指定しない場合、動的配列となり、配列サイズは実行時に管理する必要があります)ので、サイズ0の配列を持っています(これが常に0である最初の理由です - これはメタトレーダーのエラー処理ルーチンにより、致命的エラーを防ぎ、その結果として0を返しています - C/C++ ではこれはクラッシュになります)

- 配列が「直列型」(「直列型」では0番目の要素が最後の要素、通常の配列では0番目の要素が最初の要素)であることを指定しない場合、式i+1は前の要素ではなく次の要素になります。配列は「シリーズライク」に使うこともできますが、ランタイムで動作させるためにさらにいくつかのことをしなければなりませんし、小節番号が変わるとコードがクロールすることになります。

- また、少なくとも新しいティックの3本目のバーから開始するようにしてください (現在のバーではなく、新しいフラクタルが 表示される場所です)。


以下は、そのような問題なしに行おうとしていることです。
#property indicator_chart_window

double v1[];

double v2[];

int start()

{

int i,a,limit,counted_bars=IndicatorCounted();

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

if(counted_bars>0) counted_bars--;

limit = MathMin(Bars-counted_bars,Bars-1);

if (ArraySize(v1)!=Bars) ArrayResize(v1,Bars);

if (ArraySize(v2)!=Bars) ArrayResize(v2,Bars);

//

//

//

//

//

for (i=limit, a=Bars-i-1; i>=0; i--,a++)

{

v1[a]=v1[a-1]; if (iFractals(NULL,0,MODE_UPPER,i) > 0) v1[a]=High;

v2[a]=v2[a-1]; if (iFractals(NULL,0,MODE_LOWER,i) > 0) v2[a]=Low;

}

Comment("current upper frctal : "+DoubleToStr(v1,Digits)+"\n"+

"current lower frctal : "+DoubleToStr(v2,Digits));

return(0);

}
 

MQ4からDLL関数へのアクセス:可変引数リスト付き

こんにちは。

引数として変数引数リストを使用するDLL関数をインポートすることが可能かどうか、どなたかご存知でしょうか。

例:vprintf - C++リファレンス

int vprintf ( const char * format, va_list arg );

もしそうなら、どのようにそれを行うのでしょうか?

ありがとうございます。

MJ

 

戻り値のない関数を 呼び出す方法

こんにちは、皆さん。

私のプログラムでは、ある関数を呼び出したいと思っています。

しかし、その関数は戻り値を持っていません(void)。では、どのように関数を呼び出せばいいのでしょうか。

関数を呼び出すと、関数内のコードが呼び出した場所で正確に実行されます。

あたかもその場所自体に書かれているかのように?

以下にいくつかのサンプルコードを作成しました。いくつかのパラメータをチェックし、OKなら関数を実行したいと思います。

誰かがこれで私を助けることができることを願って、事前にtx、Jonkie76

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

//| エキスパートスタート関数

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

int start()

{

//----

if (価格 >= PRICE_CLOSE)

call function ; // この時点で関数を呼び出したいのですが、どうすればいいでしょうか?

さもなくば

アラート("何もしない"); //

//----

return(0)です。

}

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

//===================================================================+

//FUNCTIONS

//===================================================================+

//クローズオーダー機能 ----------------------+(以下略

void subCloseOrder()

{

int

i,

total = 0,

ticket = 0,

err = 0,

c = 0;

total = OrdersTotal();

for(i=total-1;i>=0;i--)

{

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

if(OrderSymbol()==Symbol() && (オーダーシンボル))

OrderMagicNumber()==Magic)

{

switch(OrderType())

{

case OP_BUY :

for(c=0;c<NumberOfTries;c++)

{

ticket=OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Violet);

err=GetLastError()。

if(err==0)

{

if(ticket>0) break;

さもなくば

{

if(err==0 || err==4 || err==136 || err==137 || err==138 || err==146) //ビジー・エラー

{

Sleep(5000);

を続ける。

}

else //正常なエラー

{

if(ticket>0) break;

}

}

}

ブレーク

}

}

}

}

 

とても簡単なことです。ただ、void型では結果が全くないので、結果を保存する必要はありません。(何も返しません)こんな感じです。

int start()

{

//----

if (Price >= PRICE_CLOSE)

subCloseOrder(); // At this point I'd like to call the function.How do I do that?

else

Alert("Do nothing"); //

//----

return(0);

}

 

代わりに "void "を使ってください。このように.

void someFunction(someParameters)

{

...

//

//

// no need to place return at the end, but if you want then use "just" return, like this

//

//

return;

}

voidは、関数から 値を返すつもりがないことを意味し、そうすることで事実上、関数ではなくプロシージャになります。

Jonkie76:
ハロー ガイズ&ガールズ

私のプログラムのある時点で、ある関数を呼び出したいと思います。

しかし、その関数は戻り値を持ちません(void)。では、どのように関数を呼び出せばよいのでしょうか?

関数を呼び出すと、その関数内のコードが呼び出した場所で正確に実行されます。

あたかもその場所自体に書かれているかのように?

私は以下のようなサンプルコードを作りました...いくつかのパラメータをチェックし、もしOKなら、私は関数を実行したいのです...

誰かがこれで私を助けることができることを願って、事前にtx、Jonkie76

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

//| エキスパートスタート関数

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

int start()

{

//----

if (価格 >= PRICE_CLOSE)

call function ; // この時点で関数を呼び出したいのですが、どうすればいいでしょうか?

さもなくば

アラート("何もしない"); //

//----

return(0)です。

}

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

//===================================================================+

//FUNCTIONS

//===================================================================+

//クローズオーダー機能 ----------------------+(以下略

void subCloseOrder()

{

int

i,

total = 0,

ticket = 0,

err = 0,

c = 0;

total = OrdersTotal();

for(i=total-1;i>=0;i--)

{

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

if(OrderSymbol()==Symbol() && (オーダーシンボル))

OrderMagicNumber()==Magic)

{

switch(OrderType())

{

case OP_BUY :

for(c=0;c<NumberOfTries;c++)

{

ticket=OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Violet);

err=GetLastError()。

if(err==0)

{

if(ticket>0) break;

さもなくば

{

if(err==0 || err==4 || err==136 || err==137 || err==138 || err==146) //ビジー・エラー

{

Sleep(5000);

を続ける。

}

else //正常なエラー

{

if(ticket>0) break;

}

}

}

ブレーク

}

}

}

}
理由: