初心者の方からの質問 MQL4 MT4 MetaTrader 4 - ページ 100

 

こんにちは、皆さん、EAのコードのエラーを見つけるのを手伝ってくれませんか、全てに目を通したつもりです、コードには全て正しく書かれているようですが、プログラムが何らかの理由で正しく取引できませんアイデアはこれです:アドバイザーは、同じ方向の2つの長いろうそく(ろうそく間の長さは、方向に応じて、2つの最小または最大ろうそく間、すなわち、顧問で調整可能です)を探している反対方向の価格が最後のろうそくの最小または最大を壊した場合、取引が開かれるべきである(ファイルに添付のチャート上の例の画像の状況)。本来であれば、そのような状況になるたびに取引を行うべきですが、なぜか日中の取引時間帯にしか取引を行いません。ここでは、プログラマから難しいことではありません、助けてください、エラーを修正する状況です。EAコードについては、下記および添付ファイルをご参照ください。


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

//|Spacing_Candles。mq4|(エムキューブ

//|Copyright 2017, Vladim|ブラディム

//|vkcom/id229534564|株式会社ゆめかな

//|メールVladim120385@yandex.ru |

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

#property copyright "著作権 2017, Vladim"

#プロパティリンク "vk.com/id229534564"

#property version "1.00"

#プロパティの厳密さ


//--- EAパラメータ

extern string paramEA = ""; // パラメータ EA

extern double volume = 0.01; // ボリューム

extern double stopLoss = 5; // StopLoss.

extern double takeProfit = 1.5; // テイクプロフィット

extern double maxSpacing = 150; // MaxSpacing

extern double minSpacing = 30; // 最小の間隔

extern double TrailingStop = 0; // TrailingStop

extern int magic = 127; // マジック


//---グローバル変数

datetime newCandle;

int tipです。


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

int OnInit()

{

return(INIT_SUCCEEDED);

}

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

void OnDeinit(const int reason)

{

}

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

void OnTick()

{

if(newCandle != Time[0]) FindPattern();

newCandle = Time[0];

}

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

void OpenOrder(int type) // 成行注文を出す

{

if(type == OP_BUY) if(OrderSend(_Symbol, OP_BUY, volume, Ask, 0, 0, "", magic, 0))SetSLTP(OP_BUY)を設定します。

if(type == OP_SELL) if(OrderSend(_Symbol, OP_SELL, volume, Bid, 0, 0, 0, "", magic, 0))SetSLTP(OP_SELL)を設定します。

}

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

void SetSLTP(int type) //ストップオーダーの設定

{

double sl = 0;

double tp = 0;

if(type == OP_BUY)

for(int i = 0; i < オーダートータル(); i++)

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

if(OrderSymbol() == _Symbol && OrderMagicNumber() == magic && OrderType() == OP_BUY && OrderStopLoss() == 0)

{

sl = NormalizeDouble(Low[1] - stopLoss * _Point, _Digits);

tp = NormalizeDouble(OrderOpenPrice() + (OrderOpenPrice() - Low[1]))* takeProfit, Digits);

if(OrderModify(OrderTicket(), OrderOpenPrice(), sl, tp, 0)) return;

}

if(type == OP_SELL)

for(int i = 0; i < オーダートータル(); i++)

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

if(OrderSymbol() == _Symbol && OrderMagicNumber() == magic && OrderType() == OP_SELL && OrderStopLoss() == 0)

{

sl = NormalizeDouble(High[1] + stopLoss * _Point, _Digits);

tp = NormalizeDouble(OrderOpenPrice() - (High[1] - OrderOpenPrice()))* takeProfit, Digits);

if(OrderModify(OrderTicket(), OrderOpenPrice(), sl, tp, 0)) return;

}

}

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

void FindPattern() // ローソク足間の長い距離を探す

{

if(高値[1]<高値[2] && ビッド>高値[1] && 低値[1]<低値[2])

{

double spacing = NormalizeDouble((High[2] - High[1]) / _Point, 0);

if(maxSpacing >= spacing && minSpacing <= spacing)

OpenOrder(OP_BUY)です。

}

if(安値[1] > 安値[2] && ビッド < 安値[1] && 高値[1] > 高値[2])

{

double spacing = NormalizeDouble((Low[1] - Low[2]) / _Point, 0);

if(maxSpacing >= spacing && minSpacing <= spacing)

OpenOrder(OP_SELL)です。

}

{

if(TrailingStop!=0) TrailingStop();

}

}

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

void TrailingStop()

{

double StLo,OSL,OOP;

bool error=true とする。

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

{

if (OrderSelect(i, SELECT_BY_POS))

{

tip = OrderType();

if (tip<2 && OrderSymbol()==Symbol() && OrderMagicNumber()==magic)

{

OSL = NormalizeDouble(OrderStopLoss(),Digits)。

OOP = NormalizeDouble(OrderOpenPrice(),Digits)。

if (tip==0)

{

StLo = NormalizeDouble(Bid - TrailingStop*Point,Digits)です。

if (StLo < OOP) continue;

if (StLo > OSL)

error=OrderModify(OrderTicket(),OrderOpenPrice(),StLo,OrderTakeProfit(),0,White)。


}

if (tip==1)

{

StLo = NormalizeDouble(Ask + TrailingStop*Point,Digits)です。

if (StLo > OOP) continue;

if (StLo < OSL || OSL==0 )

error=OrderModify(OrderTicket(),OrderOpenPrice(),StLo,OrderTakeProfit(),0,White)。

}

if (!error) Alert("Error TrailingStop ",GetLastError()," ",Symbol()," SL ",StLo);

}

}

}

}

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

ファイル:
 
Vladim1203:

こんにちは、皆さん、EAのコードのエラーを見つけるのを手伝ってくれませんか、全てに目を通したつもりです、コードには正しく書かれているようですが、プログラムがなぜか正しく取引されないのですアイデアはこれです:アドバイザーは、同じ方向の2つの長いろうそく(ろうそく間の長さは、方向に応じて、2つの最小または最大ろうそく間、すなわち、顧問で調整可能です)を探している反対方向の価格が最後のろうそくの最小または最大を壊した場合、取引が開かれるべきである(ファイルに添付のチャート上の例の画像の状況)。本来であれば、そのような状況になるたびに取引を行うべきですが、なぜか日中の取引時間帯にしか取引を行いません。ここでは、プログラマから難しいことではありません、助けてください、エラーを修正する状況です。EAコードは以下と添付ファイルをご覧ください。

もう十分かもね、自分でスレを作りながら、どのスレにも書き込みを積み重ねてるんだから。

 
kuzhakov:

こんにちは。
EAの取引を時間帯で制限する方法を教えてください。
フォーラムにあった方法をいろいろ試しましたが、何もうまくいかず、ライティングについて何も理解できていません。
何を入れたらいいのか、指南してもらえるとありがたいですね。


起動後に挿入すると、eXpertは毎日、端末上で指定した時間間隔で取引します


int val=Hour();
 double min=Minute();
 double Dl = val + min/100;  
 double L = xxxx+xxxx/100; //час + минуты вместо хххх - это начало времени
 double P = xxxx+xxxx/100; //час + минуты вместо хххх - это конец времени
 if(Dl<L)return;
 if(Dl>P)return;
 
Vladim1203:

こんにちは、皆さん、EAのコードのエラーを見つけるのを手伝ってくれませんか、全てに目を通したつもりです、コードには全て正しく書かれているようですが、プログラムが何らかの理由で正しく取引できませんアイデアはこれです:アドバイザーは、同じ方向の2つの長いろうそく(ろうそく間の長さは、方向に応じて、2つの最小または最大ろうそく間、すなわち、顧問で調整可能です)を探している反対方向の価格が最後のろうそくの最小または最大を壊した場合、取引が開かれるべきである(ファイルに添付のチャート上の例の画像の状況)。本来であれば、そのような状況になるたびに取引を行うべきですが、なぜか日中の取引時間帯にしか取引を行いません。ここでは、プログラマから難しいことではありません、助けてください、エラーを修正する状況です。以下のEAコードと、添付ファイルをご覧ください。


チェック・コンディション・オブ・セールス・エントリー

 
Vladim1203:

こんにちは、皆さん、EAのコードのエラーを見つけるのを手伝ってくれませんか、全てに目を通したつもりです、コードには正しく書かれているようですが、プログラムがなぜか正しく取引されないのですアイデアはこれです:アドバイザーは、同じ方向の2つの長いろうそく(ろうそく間の長さは、方向に応じて、2つの最小または最大ろうそく間、すなわち、顧問で調整可能です)を探している反対方向の価格が最後のろうそくの最小または最大を壊した場合、取引が開かれるべきである(ファイルに添付のチャート上の例の画像の状況)。本来であれば、そのような状況になるたびに取引を行うべきですが、なぜか日中の取引時間帯にしか取引を行いません。ここでは、プログラマから難しいことではありません、助けてください、エラーを修正する状況です。以下のEAコードと添付ファイルをご覧ください。

まず、見つけたローソクをチャート上にマークするEAの部分を書くと、すべてが明確になります。また、以下の行は、あなたの場合、不要です。

extern string paramEA    = "";     // Parameters EA

и

//+-----------------------------------------------------------------------------------------------+
int OnInit()
{
   
   return(INIT_SUCCEEDED);
}
//+-----------------------------------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   
}
//+-----------------------------------------------------------------------------------------------+
 

コミュニティに協力してください ...
*
フォーラムからカルマンフィルタのインジケータをダウンロードしました(ソースコード添付)。
チャート上はすべて正常です。


Expert Advisorで読み込もうとすると、以下の行が表示されます。



iValue=iCustom(NULL,timeframe,"Kalmanfilter",  4,1,1  ,0,1);

明らかに指標とは関係のない、同じ大きな数値を出力します。

それは何でしょう?

ファイル:
 
MikeZv:

地域社会からの協力 ...
*
フォーラムからカルマンフィルタのインジケータをダウンロードしました(ソースコード添付)。
チャート上はすべて正常です。


Expert Advisorで読み込もうとすると、以下の行が表示されます。



iValue=iCustom(NULL,timeframe,"Kalmanfilter",  4,1,1  ,0,1);

明らかに指標とは関係のない、同じ大きな数値を出力します。

それは何でしょう?

EMPTY_VALUE

インジケーターバッファに 空値がある

2147483647 (0x7FFFFFF)

 
Alekseu Fedotov:

EMPTY_VALUE

インジケーターバッファに 空値がある

2147483647 (0x7FFFFFF)


:)もう見つけたんだ.
なぜ出るのでしょうか?

 
MikeZv:

:)もう見つけたんだ.
でも、なぜ出てくるの?


2色あるので、インジケータは2つの配列を持っています。バー上に 1 番目の色の線があるとき、2 番目の色の配列はEMPTY_VALUE に等しい。

iValue=iCustom(NULL,timeframe, "Kalmanfilter", 4,1,1,0,1);

iValue = EMPTY_VALUE とすると、1バー上のラインはオレンジ色になります。(配列の青がEMPTY_VALUEであるため)。

 
Nikolay Ivanov:

2色あるので、インジケータは2つの配列を持っています。バー上に 1 番目の色の線があるとき、2 番目の色の配列はEMPTY_VALUE に等しい。

iValue=iCustom(NULL,timeframe, "Kalmanfilter", 4,1,1,0,1);

iValue = EMPTY_VALUE とすると、1バー上のラインはオレンジ色になります。(青い配列=EMPTY_VALUEなので)。


ありがとう、ニコライ...。
両方のラインから取りました。
そして、それらを1つに統合した(バッファを1つ残した)。同じ結果です。
*
そんな疑問があります。
このインジケーターはdraw_begin=500という変数を持っています。つまり、チャートが描画される端から(最も新しいローソク足から)何番目のローソク足かです。
また、iCustom()メソッドでインジケータの値を抽出した場合、この500ポイントはどのローソク足からカウントされるのでしょうか?
なぜ重要かというと、draw_beginは描画に使われるだけでなく、インジケータの計算にも参加しているからです。