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

 

...

LastProfitHighはどのように宣言されていますか?

もしそれが関数 本体(例えばstart())で宣言されている場合、staticとして宣言しなければ常に値が変わってしまいます。ですから、もしそれがローカル(関数内)で宣言されているならば、グローバルスコープで宣言するか、スタティック変数として宣言して、そうすれば、2つのティックの間で値を「継承」することができます。

aud4xtrader:
皆さん、こんにちは。

私はコーディングの初心者で、言語と構文を少しずつ学んでいますが、MT4がどのように変数を更新するかについて疑問が生じました。

現在開いている取引の最高利益を表示し、新しい高値に達した場合のみ更新する簡単なEAをコーディングしようとしましたが、起こっているのは、利益が出るにつれて金額が下がったり上がったりしていることで、コードのロジックで自分のエラーを見つけることができないようです。

選択したトレードがまだオープンであることを確認するためにチェックします。

t_CloseTime=OrderCloseTime(); //注文が閉じられていなければ0を返す。

if(t_CloseTime==0) //ゼロでなければ注文はクローズされます。

{

if(OrderProfit() > LastProfitHigh) LastProfitHigh=OrderProfit();

if(LastProfitHigh >= MinProfit && MinProfitReached==false) MinProfitReached=true;

}//endif

このロジックが正しいなら、なぜこの変数 "LastProfitHigh "は上下するのでしょうか......。

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

コーディングの初心者

mladen:
LastProfitHighはどのように宣言されていますか? もしそれが関数本体(例えばstart())内で宣言されている場合、staticとして宣言しなければ常に値が変わってしまうでしょう。ですから、もしそれがローカル(関数内)で宣言されているならば、グローバルスコープで宣言するか、スタティック変数として宣言して、そうすれば、2つのティックの間で値を「継承」することができます。

こんにちは、mladenです。

私は今、変数をstart()funcの外に移動し、それを "static double "と宣言しました、答えをありがとう、そしてそれが正しく表示されることを祈っています。

コードのロジックは正しく記述されていますか?

 

aud4xtrader

ロジックはOKです。

変数を開始位置の外側に移動させる場合、staticと宣言する必要はありません(関数 本体の外側にある場合、自動的にグローバル変数となり、コード全体を通して「見える」ことになります)。変数をある関数にローカルに保ち、以前の状態(例えば、前のティックの状態)を維持したい場合、staticと宣言します。

以下は、同じ結果になる2つの例です。

double previousProfit=0;

int start()

{

...

if (OrderProfit()>previiousProfit) previousProfit = OrderProfit();

}

[/PHP]

or the same thing but with static variable

[PHP]

int start()

{

static double previousProfit=0;

...

if (OrderProfit()>previiousProfit) previousProfit = OrderProfit();

}

aud4xtrader:
mladenさん、こんにちは。

私は今、変数をstart()関数の外に移動し、それを "static double "と宣言しました。

コードのロジックは正しく記述されていますか?
 

どのようにコーディングするのですか?

それは素晴らしい動作です、また素晴らしい助けをありがとうございました。

mladen:
aud4xtrader

ロジックはOKです。

もし変数を開始点の外側に移動させたら、staticと宣言する必要はありません(関数本体の外側では自動的にグローバル変数となり、コード全体を通して「見える」ようになります)。 もし変数をある関数にローカルに保ち、以前の状態(例えば以前のtickでの状態)を保持したい場合はstaticと宣言することになります。

以下は、同じ結果になる2つの例です。

double previousProfit=0;

int start()

{

...

if (OrderProfit()>previiousProfit) previousProfit = OrderProfit();

}

[/PHP]

or the same thing but with static variable

[PHP]

int start()

{

static double previousProfit=0;

...

if (OrderProfit()>previiousProfit) previousProfit = OrderProfit();

}

 

完璧だ!ありがとうございます。

mladen:
この2つの関数を試してみてください
:1つ目は、全く同じ建値の注文がすでに
あるかどうかを調べること

、2つ目は、希望の価格からnnnポイント以内にある注文があるか

どうかを調べることです。

どちらも、価格が同じか、現在開いている注文の価格との距離が指定した距離以内であれば、trueを返します。

bool existsAtSamePrice(int magicNumber, double price)

{

for (int i=OrdersTotal()-1; i>=0 ; i--)

{

if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;

if (OrderSymbol()!=Symbol()) continue;

if (OrderMagicNumber()!=magicNumber) continue;

if (CompareDouble(OrderOpenPrice(),price)) return(true);

}

return(false);

}

//

//

//

//

//

bool existsAtApproximatePrice(int magicNumber, double price, double distance)

{

for (int i=OrdersTotal()-1; i>=0 ; i--)

{

if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;

if (OrderSymbol()!=Symbol()) continue;

if (OrderMagicNumber()!=magicNumber) continue;

if (MathAbs(OrderOpenPrice()-price)< distance) return(true);

}

return(false);

}

//

//

//

//

//

bool CompareDouble(double val1, double val2)

{

return(NormalizeDouble(val1,Digits)==NormalizeDouble(val2,Digits));

}

 

コーディングの仕方

こんにちは、Pipです。

コード・スニペットをありがとう。人々がアイデアやコーディング・スタイルを共有できるのは素晴らしいことです。

Pip:
完璧です。ありがとうございます。
 

こんにちは。

お願いがあります。

ObjectDeleteコマンドで、名前に "example "を含むオブジェクトをすべて削除したい場合、どのようにコードを書けばいいのでしょうか?

オブジェクト名

"例13241"

"例453623"

私は単語 "例 "を含むすべてのオブジェクトを削除したいです。

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

 

...

次のようなものを使ってください(これは、"Example "で始まる名前を持つすべてのオブジェクトを削除します) :

string lookFor = "Example";

int lookForLength = StringLen(lookFor);

for (int i=ObjectsTotal()-1; i>=0; i--)

{

string objectName = ObjectName(i);

if (StringSubstr(objectName,0,lookForLength) == lookFor) ObjectDelete(objectName);

}

dasio:
こんにちは。

ひとつお願いがあります。

ObjectDeleteコマンドで、名前に "example "を含むオブジェクトをすべて削除したい場合、どのようにコードを書けばいいのでしょうか?

オブジェクト名

"Example13241"(例13241

"例453623"

"Example "という単語を含むすべてのオブジェクトを削除したい。

ありがとうございました。
 
mladen:
次のようなものを使ってください(これは、「Example」で始まる名前を持つすべてのオブジェクトを削除します)。
string lookFor = "Example";

int lookForLength = StringLen(lookFor);

for (int i=ObjectsTotal()-1; i>=0; i--)

{

string objectName = ObjectName(i);

if (StringSubstr(objectName,0,lookForLength) == lookFor) ObjectDelete(objectName);

}

ありがとうございます......完璧です。

もう一つ質問があります^^。

チャート上に長さを指定したトレンド ラインのセグメントを作成しました。色を設定することができ、それはOKです。同じトレンドラインに複数の色を設定することが可能かどうか知りたいです。

例えば、最初の1/3の部分には1色、2/3の部分には別の色、3/3の部分には別の色です。

それは可能ですか?

ありがとうございます。

 

..

要するに、オブジェクトのことを指しているのであれば、答えはノーです。そのために3つのオブジェクトを作成する必要があります。

バッファを使うのであれば、3色の非リペイントラインのために5つの描画バッファが 必要で、描画バッファは8つしかないので、かなり制限されます。

dasio:
ありがとうございます、完璧です。

もう一つ質問です^^。

チャート上に長さを指定したトレンドラインのセグメントを作成します。色を設定すればOKなんですが。同じトレンドラインに複数の色を設定することが可能かどうか知りたいのです。

例えば、最初の1/3の部分には1色、2/3の部分には別の色、3/3の部分には別の色です。

それは可能ですか?

ありがとうございます^^。