アスク! - ページ 21

 
billworld2:
オブジェクト名の中にあるセレクトテキスト文字列を元にオブジェクトを削除する方法はありますか?

以下はその例である。

datetime currentDay = StrToTime(Year()+". "+Month()+". "+Day()+" 00.00");

for(int i=0;i<ObjectsTotal();i++)

{

文字列名 = ObjectName(i);

if( ObjectGet(name,OBJPROP_TIME1) < currentDay && ObjectGet(name,OBJPROP_TIME2) < currentDay && ObjectGet(name,OBJPROP_TIME3) < currentDay))

{

ObjectDelete(ObjectName(i))を実行します。

return (false);

}

return(true)を実行します。

 
billworld2:
私の学習プロジェクトの一つは、Strateg Testerのチャート表示オプションを管理するtester.tplをカスタマイズすることです。デフォルトのチャートスタイルは、視覚化するのが非常に難しいと感じています。そこで、私は新しいテンプレートを作成し、すべての矢印をより魅力的な矢印に置き換えるスクリプトを作成しました。

しかし、矢印の名前に含まれる情報を取得し、それをテキストとしてチャートに表示したい。矢印の名前には、「#62 buy」や「#73 sell close」などがあります。そうすれば、チャートを見て、特定のトレード#がいつエントリー/イグジットされたかを正確に確認することができます。なぜこれが他のプラットフォーム(例えばTradeStation)にあるようにStrategy Testerにデフォルトで含まれていないのか分かりません。

とにかく、私は問題のテキストを掴んで、チャート上の既存の矢印のすぐ下に新しいテキストオブジェクトを挿入したいのです。しかし、これを達成する方法がわかりません。

どうすればいいのでしょうか?

ありがとうございます。

ビル

そうですね、スクリプトを書くか、矢印の情報を読み込んで、その下にテキストラベルを作るような関数を 書けばよいでしょう。そして、新しい矢印が描画されるたびに、そのスクリプトを実行します。または、EAのメイン関数の最後にその関数を置くだけです。なぜこの情報がメタトレーダーに標準装備されていないのかわかりませんが、そのような機能をコード化するのは簡単です。

 
Kalenzo:
日付と時間関数について読んで、iBarShift関数を使って、指定した時間枠から指定した月の最初のバーのシフトを取得する必要があります。

あなたにとっては些細なことなのでしょう。ただ、限られたドキュメンテーション(そこに提供されている多くの例)に従って、私はまだそれを得ていないのです。どのようにすればよいか、例を示していただけませんか?

ありがとうございます。

ビル

 
Kalenzo:
そうですね、矢印の情報を読み込んで、その下にテキストラベルを作成するスクリプトや関数を書くことができます。そして、新しい矢印が描画されるたびに、そのスクリプトを実行します。あるいは、その関数をEAのメイン関数の最後に配置します。なぜこの情報がメタトレーダーに標準装備されていないのか分かりませんが、このような機能をコーディングするのは簡単です。

ありがとうございます。しかし、具体的にどのようにスクリプトをコーディングすればいいのか行き詰まっています。もしお時間があれば、簡単な例を提示していただけるとありがたいです。

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

ビル

 

よくわからないのですが。はっきり言って、私はオブジェクト名に基づいてサブストリングのマッチングを行う方法を探しています。例えば、"-206 "という文字列を含むオブジェクトのグループがあるとします(他のテキストも含む)。その名前に"-206 "が含まれているオブジェクトをすべて見つけて削除したいのです。

下の例で混乱するのは、OBJPROP_TIME1、OBJPROP_TIME2、OBJPROP_TIME3との関連性です。オブジェクトは最大3つの時間座標を 持つことができるのは知っています。私がやろうとしていることと、それがどのように適合するのかが、よくわかりません。

Kalenzo:
以下はその例です。

datetime currentDay = StrToTime(Year()+". "+Month()+". "+Day()+" 00.00");

for(int i=0;i<ObjectsTotal();i++)

{

文字列名 = ObjectName(i);

if( ObjectGet(name,OBJPROP_TIME1) < currentDay && ObjectGet(name,OBJPROP_TIME2) < currentDay && ObjectGet(name,OBJPROP_TIME3) < currentDay))

{

ObjectDelete(ObjectName(i))を実行します。

return (false);

}

}

return(true)です。
 
billworld2:
よくわかりませんね。オブジェクト名から文字列のマッチングを行う方法を探しています。例えば、"-206 "という文字列を含むオブジェクトのグループがあるとします(他のテキストも含む)。以下の例で混乱するのは、OBJPROP_TIME1、OBJPROP_TIME2、OBJPROP_TIME3との関連付けです。オブジェクトは最大3つの時間座標を持つことができるのは知っています。私がやろうとしていることと、それがどのように適合するのかがわかりません。

OK , これを試してみてください。

for(int i=0;i<ObjectsTotal();i++)

{

文字列名 = ObjectName(i);

if(StringSubstr( 名前, 0, 3)==206)

{

ObjectDelete(ObjectName(i))を実行します。

}

}

オブジェクト名の最初の3文字が206の場合、そのオブジェクトは削除されます。

 
billworld2:
ありがとうございます。しかし、具体的にどのようにスクリプトをコーディングすればよいのか、行き詰まっています。もし時間があれば、簡単な例を示していただけると幸いです。

またよろしくお願いします。

ビル

まず、グローバル変数 (スクリプトのグローバル変数) を int objectCount と宣言します。

そして、ea の最後にすべてのオブジェクトを処理します (たとえば、名前で検索できます)。

for(int i=0;i>=ObjectsTotal(OBJ_ARROW) ;i++)

{

//次に、オブジェクトのラベルが存在しない場合は、それを描画します。

//既存の矢印の名前を取って、Lのラベルを付けて、識別します。

if(ObjectFind(ObjectName(i)+"L")== -1) //オブジェクトのラベルがなければ描画しない。

{

ObjectCreate(ObjectName(i)+"L",OBJ_ARROW,0,ObjectGet(ObjectName(i), OBJPROP_TIME1),ObjectGet(ObjectName(i),(OBJPROP_PRICE1+3*Point))).ObjectName(i)+"L".ObjectCreate(ObjectName(i)+"L",OBJ_ARROW,0).ObjectGet(ObjectName(i),OBJPROP_TIME)

// 以上

}

}

しかし、これは動作するはずで、あなたは今、正しい方法を知っています。

 

よし了解です。実はStringFind() を使う必要があったんです。ご指摘ありがとうございました。

#property show_inputs

extern string stringname="blah";

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

//| スクリプトプログラム開始関数

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

int start()

{

//----

for(int i=0;i<ObjectsTotal();i++)

if(StringFind(ObjectName(i),stringname,0)>0)を実行します。

{

ObjectDelete(ObjectName(i))。

Kalenzo:
OK , これを試してみてください。

for(int i=0;i<ObjectsTotal();i++)

{

文字列名 = ObjectName(i);

if(StringSubstr( 名前, 0, 3)==206)

{

ObjectDelete(ObjectName(i))を実行します。

}

}

オブジェクト名の最初の3文字が206の場合、そのオブジェクトは削除されます。
 

ありがとうございます、でも、これではうまくいきません。まず、「i>=ObjectsTotal」を「i<=ObjectsTotal」に変更しました(typo)。それから、矢印オブジェクトの 名前を含む新しいテキストオブジェクトを作成したいところで、別の矢印オブジェクトを 作成していることに気がつきました。とにかく、下のコードは、同じ座標に重なるたくさんの矢印(約50個)を作成しているのです。

この点については、まだ迷っています。もし、あなたがもう一度見てくれる機会があれば、とても感謝します。はっきり言って、新しいテキストオブジェクトを1つ作成して、既存の各矢印オブジェクトの下に配置したいのです。テキストオブジェクトのテキスト記述は、矢印オブジェクトの名前と同じです。

ビル

Kalenzo:
まず、グローバル変数(スクリプトのグローバル)を宣言する int objectCount;

そして、ea の最後にすべてのオブジェクトを処理します (たとえば、名前で検索することができます)。

for(int i=0;i>=ObjectsTotal(OBJ_ARROW) ;i++)

{

//次に、オブジェクトのラベルが存在しない場合は、それを描画します。

//既存の矢印の名前を取って、Lのラベルを付けて、識別します。

if(ObjectFind(ObjectName(i)+"L")== -1) //オブジェクトのラベルがなければ描画しない。

{

ObjectCreate(ObjectName(i)+"L",OBJ_ARROW,0,ObjectGet(ObjectName(i), OBJPROP_TIME1),ObjectGet(ObjectName(i),(OBJPROP_PRICE1+3*Point))).ObjectName(i)+"L".ObjectCreate(ObjectName(i)+"L",OBJ_ARROW,0).ObjectGet(ObjectName(i),OBJPROP_TIME)

// 以上

}

}

これは単なる例で、バグがないかチェックする時間がありません。 でも、これでうまくいくはずです。そして、あなたは正しい方法を知っています。
 

contains-based object deletion (contains-basedオブジェクト削除)

オブジェクト名の 中にある選択テキスト文字列に基づいて、オブジェクトを削除する方法はありますか?

Edit: Kalenzoさんからのポインタで解決しました。回答は投稿番号212にあります。