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

 

インジケーターのレベル線に色、スタイル、ウェイトを追加することは可能ですか?

こんにちは。

インジケーターのレベル線に色、スタイル、ウェイトを追加することが可能かどうか、どなたか教えていただけないでしょうか?

手始めに、RSIレベルにスタイルと色の両方を指定したいのですが、例えば、以下の行にさらにコードを追加することで可能なのかどうか疑問に思っています。#property indicator_level1 70 ?

可能であれば、私は誰かが私に示すことができれば、非常に感謝します。

ありがとうございます。

Laurus

 

...

はい、できます。

以下のプロパティを 使用します。

#property indicator_levelcolor

#property indicator_levelstyle

#property indicator_levelwidth

[/PHP]

If you use indicator_levelwidth greater than 1, only indicator_levelstyle that metatrader will allow is STYLE_SOLID (solid line). Also, you can specify only one color, style and width for all levels (if you need more than one color, style or width for levels, you either have to use buffers or objects - horizontal line, for example)

You can use the SetLevelStyle() function too for that purpose,with same limitations as described above

[PHP]

void SetLevelStyle( int draw_style, int line_width, color clr=CLR_NONE)

Laurus12:
こんにちは。

インジケーターのレベル線に色、スタイル、ウェイトを追加することが可能かどうか、どなたか教えていただけないでしょうか?

手始めに、私はRSIレベルにスタイルと色の両方を指定したいと思いますし、例えばラインに多くのコードを追加することによってこれを行うことができるかどうか疑問に思っています。#property indicator_level1 70 ?

可能であれば、私は誰かが私に示すことができれば、非常に感謝します。

ありがとうございます。

ローラス
 

Mladenさん、いつもご返信ありがとうございます。

あなたが書いていることは、まさに私が恐れていたことです。機能的な部分に関しては、まだ私の頭の中にはありません。

写真を見ていただければ、私がどのようにしたいかがわかると思います。妥協案として、普通の水平線を使って いますが、インジケータ自体でトレンドラインを引くので、良い解決策とは言えません。

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

Laurus

ファイル:
 

...

あなたの絵を見ると、それがあなたが適用できる唯一の解決策(オブジェクトを使用する)であるように思われます。描画バッファを 使用すると、単に描画バッファを消耗し、そのインジケータで使用しているすべての値を描画することができなくなります。メタトレーダー4が8つの描画バッファしか持たないという決定をしたことで、私たちはまだ「お金を払って」いるのです。

Laurus12:
Mladenさん、いつもご返事ありがとうございます。

おっしゃる通り、私が恐れていたことです。関数の部分に関しては、まだ私の頭の中にありません。

画像を見ていただければ、私がどのようにしたいかがわかると思います。妥協案として、普通の水平線を使っていますが、インジケータ自体でトレンドラインを描くので、良い解決策ではありません。

ありがとうございます。

Laurus
 

外部DLLがおかしな結果を返す

こんにちは。

以下は、外部DLLを呼び出す非常にシンプルな例です。ジャーナルログには、ストラテジーテスターで 使用した場合、0から始まる増加する数字が表示されるはずです。

しかし、結果はかなり奇妙です。ジャーナルログの最初の行は大きな数字(例えば18472)が表示され、その後しばらくは適切に増加しますが、一度に約10ステップ、時には100ステップ以上ジャンプするようになります。

どなたか、この理由と修正方法を教えていただけませんか?

ありがとうございます。

// MyExpert.mql //

#import "MyDLL.dll"

int Test();

#import

void start(){

Print(Test());

}[/CODE]

// MyDLL.def //

LIBRARY MyDLL

EXPORTS

Test

[CODE]

// MyDLL.dll //

int i= 0;

int __stdcall Test() {

i++;

return i;

}
 

インジケーターのコードに問題がある

こんにちは、皆さん。

MT4のプログラミングを勉強しているのですが、今まさにPinBarを検出し、買いか売りかを指示するインジケータを開発中です。このインジケータは、4時間足チャート用に開発しました。検出のルールは以下の通りです。

ローソク足の長さがローソク足の長さの35%未満であること。

ローソク足の芯が1本以上、長さが50%以上であること。

これまでのところ、私はインジケータでこれらのバーを検出するのに問題はありません。

しかし、次のルールは、私に購入または売却を指示します。

1時間足のチャートを拡大し、4時間足のチャートにあるピンバーを形成した4本のバーを見てみます。

iClose関数を使って、そのフォーメーションの最初と最後のバーの終値の値を1時間足で拾ってみました。

しかし、今のプログラムでは、常に1時間足チャートの最初と最後のローソク足そのものを見ています。そして、それはダメなんです。これは、チャートではなく、フォーメーションの最初と最後のバーでなければならないのです。

これが、私が今持っている間違ったiClose関数を含むコードです。

if ( (((100.0/CandleLength)*BodyLength)=50.0) || (((100.0/CandleLength)*LowerWick)>=50.0) ) && iClose(Symbol(),60,1) > iClose(Symbol(),60,4))

{

Buy = Close;

SetLevel(true,i+1,Close);

}

4時間足のローソクの背景にある1時間足のローソクを正確に特定することができません。

どなたか、私の問題に答えを与えてくれる方はいらっしゃいませんか?

それを修正しました。

datetime H4BarTime;

int H1BarNumber;

H4BarTime = 時間。

H1BarNumber = iBarShift(NULL, PERIOD_H1, H4BarTime);

tx 非常に多く!

ヤコブ

 
mladen:
あなたの絵を見ると、あなたが適用できる唯一の解決策(オブジェクトを使用)であるように思われます。描画バッファを使用すると、単に描画バッファを消耗し、そのインジケータで使用しているすべての値を描画することができなくなります。メタトレーダー4が8つの描画バッファを持つことを決定したことで、私たちはまだ "お金を払う "ことがあります

Mladenさん、返信が遅くなり申し訳ございません。あなたが書いたことについては、少なくとも今、私は確かに知っています。

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

Laurus

 

入学基準に関するヘルプ

こんにちは、皆さん。

私は、MAを使用してエントリー基準を作成しようとしています。私のエントリー基準は単純で、現在のローソク足ではなく、ローソク足の終値でFast MAがSlow MAを上方にクロスしたときにロングトレードを行いたい、またはその逆を行いたいのです。

現状では、Fast MAがSlow MAを上方でクロスするとロングトレードを誘発するのですが、そのローソクはまだ閉じておらず、ローソクが閉じても最終MAは上方でクロスしないこともあり、その特定のトレードは誘発しないはずなのに、システムは一旦上方にクロスしたためそれを誘発する、ということがあります。これはショートトレードでも同じです。

すでに数日この作業を続けていますが、何の進展もありません。どなたか、どうすればいいのか、教えていただけませんか?ありがとうございます。

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

extern double TakeProfit=2700.0;

extern double Lots=0.1;

extern double StopLoss=2500.0;

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

//| エキスパート初期化関数

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

int init()

{

//----

//----

return(0);

}

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

//| エキスパート初期化関数

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

int deinit()

{

//----

//----

return(0);

}

int Crossed (double line1 , double line2)

{

static int last_direction = 0;

static int current_dirction = 0;

if(line1>line2)current_dirction = 1; //上方向

if(line1<line2)current_dirction = 2; //down

if(current_dirction != last_direction) //変更されました。

{

last_direction = current_dirction;

return (last_direction);

}

さもなくば

{

return (0);

}

}

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

//| エキスパートスタート機能

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

int start()

{

//----

int cnt, ticket, total;

double shortEma, longEma;

if(Bars<100)

{

Print("bars less than 100");

return(0);

}

if(テイクプロフィット<10)

{

Print("TakeProfitが10未満");

return(0); // TakeProfitのチェック

}

shortEma = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,0)。

longEma = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,0);

int isCrossed = Crossed (shortEma,longEma);

total = OrdersTotal();

if(total < 1)

{

if(isCrossed == 1)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*ポイント, Ask+TakeProfit*Point,

"私のEA",12345,0,緑);

if(チケット>0)

{

if(オーダーセレクト(ticket,SELECT_BY_TICKET,MODE_TRADES))

Print("BUY order opened : ",OrderOpenPrice());

else Print("BUY注文の開始エラー :",GetLastError())。

return(0);

}

if(isCrossed == 2)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point.Bid-TakeProfit*Point,

Bid-TakeProfit*Point, "私のEA",12345,0,赤);

if(チケット>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

Print("SELL order opened : ",OrderOpenPrice());

else Print("SELL注文の開始エラー :",GetLastError());

return(0);

return(0)。

return(0);

}

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

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

テランス

 

...

テランス

これらの行を変更してみてください。

shortEma = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,0);

longEma = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,0);

int isCrossed = Crossed (shortEma,longEma);[/PHP]

to something like this :

[PHP] int isCrossed = 0;

double shortEma1 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,1);

double longEma1 = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,1);

double shortEma2 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,2);

double longEma2 = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,2);

double diff1 = shortEma1-longEma1;

double diff2 = shortEma2-longEma2;

if ((diff1*diff2)<0)

{

if (shortEma1>longEma1)

isCrossed = 1;

else isCrossed = 2;

}

そうすれば、crossed関数は 必要なく、クローズドバーのクロスをチェックします。

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

私はMAを使ったエントリー基準を作ろうとしています。私のエントリー基準は単純で、現在のローソク足ではなく、ローソク足の終値でFast MAがSlow MAを上にクロスしたらロングトレードを行いたい、またはその逆も行いたいのです。

現状では、Fast MAがSlow MAを上方でクロスするとロングトレードを誘発するのですが、そのローソクはまだ閉じておらず、ローソクが閉じても最終MAは上方でクロスしないこともあり、その特定のトレードは誘発しないはずなのに、システムは一旦上方にクロスしたためそれを誘発する、ということがあります。これはショートトレードでも同じです。

すでに数日この作業を続けていますが、何の進展もありません。どなたか、どうすればいいのか、教えていただけませんか?ありがとうございます。

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

extern double TakeProfit=2700.0;

extern double Lots=0.1;

extern double StopLoss=2500.0;

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

//| エキスパート初期化関数

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

int init()

{

//----

//----

return(0);

}

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

//| エキスパート初期化関数

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

int deinit()

{

//----

//----

return(0);

}

int Crossed (double line1 , double line2)

{

static int last_direction = 0;

static int current_dirction = 0;

if(line1>line2)current_dirction = 1; //上方向

if(line1<line2)current_dirction = 2; //down

if(current_dirction != last_direction) //変更されました。

{

last_direction = current_dirction;

return (last_direction);

}

さもなくば

{

return (0);

}

}

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

//| エキスパートスタート機能

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

int start()

{

//----

int cnt, ticket, total;

double shortEma, longEma;

if(Bars<100)

{

Print("bars less than 100");

return(0);

}

if(テイクプロフィット<10)

{

Print("TakeProfitが10未満");

return(0); // TakeProfitのチェック

}

shortEma = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,0)。

longEma = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,0);

int isCrossed = Crossed (shortEma,longEma);

total = OrdersTotal();

if(total < 1)

{

if(isCrossed == 1)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*ポイント, Ask+TakeProfit*Point,

"私のEA",12345,0,緑);

if(チケット>0)

{

if(オーダーセレクト(ticket,SELECT_BY_TICKET,MODE_TRADES))

Print("BUY order opened : ",OrderOpenPrice());

else Print("BUY注文の開始エラー :",GetLastError())。

return(0);

}

if(isCrossed == 2)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point.Bid-TakeProfit*Point,

Bid-TakeProfit*Point, "私のEA",12345,0,赤);

if(チケット>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

Print("SELL order opened : ",OrderOpenPrice());

else Print("SELL注文の開始エラー :",GetLastError());

return(0);

return(0);

return(0);

}

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

ありがとうございます。

テランス
 
mladen:
テランス

以下の行を変更してみてください。

shortEma = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,0);

longEma = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,0);

int isCrossed = Crossed (shortEma,longEma);[/PHP]

to something like this :

[PHP] int isCrossed = 0;

double shortEma1 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,1);

double longEma1 = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,1);

double shortEma2 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,2);

double longEma2 = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,2);

double diff1 = shortEma1-longEma1;

double diff2 = shortEma2-longEma2;

if ((diff1*diff2)<0)

{

if (shortEma1>longEma1)

isCrossed = 1;

else isCrossed = 2;

}

この方法だと、crossed関数を使わなくても、クローズドバーでクロスをチェックすることができます。

こんにちは、Mladen。教えていただいたことを試してみたところ、とてもうまくいきました。しかし、コードの背後にあるロジックをよく理解していません。なぜiMAのシフトを1と2に設定するのですか?(diff1*diff2)<0)とするのでしょうか?申し訳ありませんが、私は現在まだ学習フレーズ中です。

ありがとうございます。

テランス