MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 745

 

テストされていないインジケーターと残りのすべての反転レベルバンドを非表示にし、テスト済みのバンドのみを残すことは可能ですか?つまり、 extern bool zone_show_weak=true;を非表示にします。以下のコードでは、(zone_strength [i] == ZONE_WEAK && zone_show_weak == false)などを非表示にできません。たぶん誰かがコードを理解して修正するか、私が上で説明したレベルを削除します。インジケーターコード:

#propertycopyright"Copyright©2017AndrewSumner"

#property link ""

#プロパティindicator_chart_window

#property Indicator_buffers 4

#propertyindicator_color1赤

#propertyindicator_color2赤

#プロパティindicator_color3 DodgerBlue

#プロパティindicator_color4 DodgerBlue


extern int BackLimit = 300; //バックバック

extern int TimeFrame = 0;

extern string TimeString = "0 =現在、60 = H1、240 = H4、1440 =日、10080 =週、43200=月";


extern color color_support_weak = MediumAquamarine; //サポート-弱いDarkSlateGrayのサポート

extern color color_support_untested = SeaGreen; //チェックを外します

extern colorcolor_support_verified=緑;

extern color color_support_proven = LimeGreen;

extern colorcolor_support_turncoat=オリーブドラブ;

extern colorcolor_resist_weak=シエナ;

extern colorcolor_resist_untested=オーキッド;

extern colorcolor_resist_verified=クリムゾン;

extern colorcolor_resist_proven=赤;

extern color color_resist_turncoat = DarkOrange;


extern bool zone_show_weak = true;

extern double zone_fuzzfactor = 0.2;

extern bool zone_solid = false; // falseの場合はtrue、フルストライプゾーンはありませんが、幅幅の長方形で囲まれます

extern int zone_linewidth = 2;

extern int zone_style = 0;

extern bool zone_show_info = true;

extern int zone_label_shift = 22; //ラベルの水平オフセット。ただし、インジケーターを削除した後のみ

extern bool zone_show_alerts = false;

extern bool zone_alert_popups = true;

extern bool zone_alert_sounds = true;

extern bool send_email = false;

extern int zone_alert_waitseconds = 300;

extern bool zone_merge = true;

extern bool zone_extend = true;


extern bool fractals_show = false;

extern double fractal_fast_factor = 3.0;

extern double fractal_slow_factor = 6.0;

extern bool SetGlobals = true;


double FastDnPts []、FastUpPts [];

double SlowDnPts []、SlowUpPts [];


double zone_hi [1000]、zone_lo [1000];

int zone_start [1000]、zone_hits [1000]、zone_type [1000]、zone_strength [1000]、zone_count = 0;

boolzone_turn [1000];


#define ZONE_SUPPORT 1

#define ZONE_RESIST 2


#define ZONE_WEAK 0

#define ZONE_TURNCOAT 1

#define ZONE_UNTESTED 2

#define ZONE_VERIFIED 3

#define ZONE_PROVEN 4


#define UP_POINT 1

#define DN_POINT -1


int time_offset = 0;


int init()

{{

IndicatorBuffers(4);


SetIndexBuffer(0、SlowDnPts);

SetIndexBuffer(1、SlowUpPts);

SetIndexBuffer(2、FastDnPts);

SetIndexBuffer(3、FastUpPts);


if(fractals_show == true)

{{

SetIndexStyle(0、DRAW_ARROW、0、3);

SetIndexStyle(1、DRAW_ARROW、0、3);

SetIndexStyle(2、DRAW_ARROW、0、1);

SetIndexStyle(3、DRAW_ARROW、0、1);

SetIndexArrow(0、218);

SetIndexArrow(1、217);

SetIndexArrow(2、218);

SetIndexArrow(3、217);

}

そうしないと

{{

SetIndexStyle(0、DRAW_NONE);

SetIndexStyle(1、DRAW_NONE);

SetIndexStyle(2、DRAW_NONE);

SetIndexStyle(3、DRAW_NONE);

}


if(TimeFrame!= 1 && TimeFrame!= 5 && TimeFrame!= 15 &&

TimeFrame!= 60 && TimeFrame!= 240 && TimeFrame!= 1440 &&

TimeFrame!= 10080 && TimeFrame!= 43200)

時間枠=0;


if(TimeFrame <Period())

時間枠=期間();


return(0);

}


int deinit()

{{

DeleteZones();

DeleteGlobalVars();

return(0);

}


int start()

{{

if(NewBar()== true)

{{

int old_zone_count = zone_count;


高速フラクタル();

SlowFractals();

DeleteZones();

FindZones();

DrawZones();

if(zone_count <old_zone_count)

DeleteOldGlobalVars(old_zone_count);

}


if(zone_show_info == true)

{{

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

{{

文字列lbl;

if(zone_strength [i] == ZONE_PROVEN)

lbl = ""; //実証済み

else if(zone_strength [i] == ZONE_VERIFIED)

lbl = ""; //チェック済み

else if(zone_strength [i] == ZONE_UNTESTED)

lbl = ""; //テストしない

else if(zone_strength [i] == ZONE_TURNCOAT)

lbl = ""; //逆転

そうしないと

lbl = ""; // 弱い


if(zone_type [i] == ZONE_SUPPORT)

lbl = lbl + "under"; //サポート

そうしないと

lbl = lbl + "sop"; //抵抗


if(zone_hits [i]> 0 && zone_strength [i]> ZONE_UNTESTED)

{{

if(zone_hits [i] == 1)

lbl = lbl + "、T =" + zone_hits [i]; //テストカウント

そうしないと

lbl = lbl + "、T =" + zone_hits [i]; //テストカウント

}


int Adjust_hpos;

int wbpc = WindowBarsPerChart();

int k;

k = Period()* 60 +(20 + StringLen(lbl));

if(wbpc <80)

Adjust_hpos = Time [0] + k * 4;

else if(wbpc <125)

Adjust_hpos = Time [0] + k * 8;

それ以外の場合(wbpc <250)

Adjust_hpos = Time [0] + k * 15;

else if(wbpc <480)

Adjust_hpos = Time [0] + k * 29;

else if(wbpc <950)

Adjust_hpos = Time [0] + k * 58;

そうしないと

Adjust_hpos = Time [0] + k * 115;


int shift = k * zone_label_shift;

double vpos = zone_hi [i]-(zone_hi [i] --zone_lo [i])/ 2;


//レベルの説明のテキスト

文字列s="SSSR#" + i + "LBL";

ObjectCreate(s、OBJ_TEXT、0、0、0);

ObjectSet(s、OBJPROP_TIME1、adjust_hpos + shift);

ObjectSet(s、OBJPROP_PRICE1、vpos);

ObjectSetText(s、StringRightPad(lbl、36、 "")、11、 "Courier New"、clrWhite); //黒

}

}


CheckAlerts();


return(0);

}


void CheckAlerts()

{{

static int lastalert = 0;


if(zone_show_alerts == false)

戻る;


if(Time [0]-lastalert> zone_alert_waitseconds)

if(CheckEntryAlerts()== true)

lastalert = Time [0];

}


bool CheckEntryAlerts()

{{

//レコードを確認します

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

{{

if(Close [0]> = zone_lo [i] && Close [0] <zone_hi [i])

{{

if(zone_show_alerts == true)

{{

if(zone_alert_popups == true)

{{

if(zone_type [i] == ZONE_SUPPORT)

Alert(Symbol()+ TimeFrameToString(TimeFrame)+ ":サポートゾーンが入力されました"); //サポートゾーンを導入

そうしないと

Alert(Symbol()+ TimeFrameToString(TimeFrame)+ ":レジスタンスゾーンが入力されました"); //抵抗ゾーンを導入

}


if(zone_alert_sounds == true)

PlaySound( "alert.wav");

}

if(send_email == true)

{{

string dir = "";

string msg = StringConcatenate(Symbol()、 "-"、TimeFrameToString(TimeFrame)、 "at"、TimeToStr(Time [0]、TIME_DATE | TIME_SECONDS)、

""、dir、 "ゾーンが入力されました");

if(zone_type [i] == ZONE_SUPPORT)

{{

dir="サポート";

SendMail( "SS_SupRes_v04c alert"、msg);

}

そうしないと

{{

dir="抵抗";

SendMail( "SS_SupRes_v04c alert"、msg);

}

}

return(true);

}

}


return(false);

}


void DeleteGlobalVars()

{{

if(SetGlobals == false)

戻る;


GlobalVariableDel( "SSSR_Count _" + Symbol()+ TimeFrame);

GlobalVariableDel( "SSSR_Updated _" + Symbol()+ TimeFrame);


int old_count = zone_count;

zone_count = 0;

DeleteOldGlobalVars(old_count);

}


void DeleteOldGlobalVars(int old_count)

{{

if(SetGlobals == false)

戻る;


for(int i = zone_count; i <old_count; i ++)

{{

GlobalVariableDel( "SSSR_HI _" + Symbol()+ TimeFrame + i);

GlobalVariableDel( "SSSR_LO _" + Symbol()+ TimeFrame + i);

GlobalVariableDel( "SSSR_HITS _" + Symbol()+ TimeFrame + i);

GlobalVariableDel( "SSSR_STRENGTH _" + Symbol()+ TimeFrame + i);

GlobalVariableDel( "SSSR_AGE _" + Symbol()+ TimeFrame + i);

}

}


void FindZones()

{{

int i、j、shift、bustcount = 0、testcount = 0;

ダブルハイバル、ローバル;

bool turn = false、hasturned = false;


double temp_hi [1000]、temp_lo [1000];

int temp_start [1000]、temp_hits [1000]、temp_strength [1000]、temp_count = 0;

bool temp_turn [1000]、temp_merge [1000];

int merge1 [1000]、merge2 [1000]、merge_count = 0;


//ゾーンを最も古いものから最も小さいものへとループします(最後の5つのバーは無視します)。

//現在まで生き残った人を見つける...

for(shift = MathMin(iBars(NULL、TimeFrame)-1、BackLimit); shift> 5; shift--)

{{

double atr = iATR(NULL、TimeFrame、7、shift);

double fu = atr / 2 * zone_fuzzfactor;

bool isWeak;

bool touchOk = false;

bool isBust = false;

double close = iClose(NULL、TimeFrame、shift);

ダブルハイ=iHigh(NULL、TimeFrame、shift);

ダブルロー=iLow(NULL、TimeFrame、shift);

ダブルhi_i;

double lo_i;


if(FastUpPts [shift]> 0.001)

{{

//ハイポイントジグザグ

isWeak = true;

if(SlowUpPts [shift]> 0.001)

isWeak = false;


hival = high;

if(zone_extend == true)

hival + = fu;


loval = MathMax(MathMin(close、high-fu)、high-fu * 2);

turn = false;

hasturned = false;

isbust = false;


バスカウント=0;

testcount = 0;


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

{{

hi_i = iHigh(NULL、TimeFrame、i);

lo_i = iLow(NULL、TimeFrame、i);


if((turned == false && FastUpPts [i]> = loval && FastUpPts [i] <= hival)||

(turned == true && FastDnPts [i] <= hival && FastDnPts [i]> = loval))

{{

//潜在的なタッチ、最後から10本以上のキャンドルであることを確認してください

touchOk = true;

for(j = i + 1; j <i + 11; j ++)

{{

if((turned == false && FastUpPts [j]> = loval && FastUpPts [j] <= hival)||

(turned == true && FastDnPts [j] <= hival && FastDnPts [j]> = loval))

{{

touchOk = false;

壊す;

}

}


if(touchOk == true)

{{

//タッチがあります。一度バストされた場合は、バストカウントを削除します

//このレベルはまだ有効であり、サイドを切り替えただけであることがわかっているため

バスカウント=0;

testcount ++;

}

}


if((turned == false && hi_i> hival)||

(turned == true && lo_i <loval))

{{

//このレベルは少なくとも1回は無効になっています

bustcount ++;


if(bustcount> 1 || isWeak == true)

{{

//2つ以上

isBust = true;

壊す;

}


if(turned == true)

turn = false;

else if(turned == false)

turn = true;


hasturned = true;


//以前のヒットを忘れる

testcount = 0;

}

}


if(isBust == false)

{{

//レベルはまだ有効です、リストに追加してください

temp_hi [temp_count] = hival;

temp_lo [temp_count] = loval;

temp_turn [temp_count] = hasturned;

temp_hits [temp_count] = testcount;

temp_start[temp_count]=シフト;

temp_merge [temp_count] = false;

if(testcount> 3)

temp_strength [temp_count] = ZONE_PROVEN;

else if(testcount> 0)

temp_strength [temp_count] = ZONE_VERIFIED;

else if(hasturned == true)

temp_strength [temp_count] = ZONE_TURNCOAT;

else if(isWeak == false)

temp_strength [temp_count] = ZONE_UNTESTED;

そうしないと

temp_strength [temp_count] = ZONE_WEAK;


temp_count ++;

}

}

else if(FastDnPts [shift]> 0.001)

{{

//低いジグザグポイント

isWeak = true;

if(SlowDnPts [shift]> 0.001)

isWeak = false;


loval=低;

if(zone_extend == true)

loval = fu;


hival = MathMin(MathMax(close、low + fu)、low + fu * 2);

turn = false;

hasturned = false;


バスカウント=0;

testcount = 0;

isbust = false;


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

{{

hi_i = iHigh(NULL、TimeFrame、i);

lo_i = iLow(NULL、TimeFrame、i);


if((turned == true && FastUpPts [i]> = loval && FastUpPts [i] <= hival)||

(turned == false && FastDnPts [i] <= hival && FastDnPts [i]> = loval))

{{

//潜在的なタッチ、最後から10本以上のキャンドルであることを確認してください

touchOk = true;

for(j = i + 1; j <i + 11; j ++)

{{

if((turned == true && FastUpPts [j]> = loval && FastUpPts [j] <= hival)||

(turned == false && FastDnPts [j] <= hival && FastDnPts [j]> = loval))

{{

touchOk = false;

壊す;

}

}


if(touchOk == true)

{{

//タッチがあります。一度バストされた場合は、バストカウントを削除します

//このレベルはまだ有効であり、サイドを切り替えただけであることがわかっているため

バスカウント=0;

testcount ++;

}

}


if((turned == true && hi_i> hival)||

(turned == false && lo_i <loval))

{{

//このレベルは少なくとも1回は無効になっています

bustcount ++;


if(bustcount> 1 || isWeak == true)

{{

//2つ以上

isBust = true;

壊す;

}


if(turned == true)

turn = false;

else if(turned == false)

turn = true;


hasturned = true;


//以前のヒットを忘れる

testcount = 0;

}

}


if(isBust == false)

{{

//レベルはまだ有効です、リストに追加してください

temp_hi [temp_count] = hival;

temp_lo [temp_count] = loval;

temp_turn [temp_count] = hasturned;

temp_hits [temp_count] = testcount;

temp_start[temp_count]=シフト;

temp_merge [temp_count] = false;


if(testcount> 3)

temp_strength [temp_count] = ZONE_PROVEN;

else if(testcount> 0)

temp_strength [temp_count] = ZONE_VERIFIED;

else if(hasturned == true)

temp_strength [temp_count] = ZONE_TURNCOAT;

else if(isWeak == false)

temp_strength [temp_count] = ZONE_UNTESTED;

そうしないと

temp_strength [temp_count] = ZONE_WEAK;


temp_count ++;

}

}

}


//重複するゾーンを探します...

if(zone_merge == true)

{{

merge_count = 1;

int反復=0;

while(merge_count> 0&&反復<3)

{{

merge_count = 0;

反復++;


for(i = 0; i <temp_count; i ++)

temp_merge [i] = false;


for(i = 0; i <temp_count-1; i ++)

{{

if(temp_hits [i] == -1 || temp_merge [j] == true)

継続する;


for(j = i + 1; j <temp_count; j ++)

{{

if(temp_hits [j] == -1 || temp_merge [j] == true)

継続する;


if((temp_hi [i]> = temp_lo [j] && temp_hi [i] <= temp_hi [j])||

(temp_lo [i] <= temp_hi [j] && temp_lo [i]> = temp_lo [j])||

(temp_hi [j]> = temp_lo [i] && temp_hi [j] <= temp_hi [i])||

(temp_lo [j] <= temp_hi [i] && temp_lo [j]> = temp_lo [i]))

{{

merge1 [merge_count] = i;

merge2 [merge_count] = j;

temp_merge [i] = true;

temp_merge [j] = true;

merge_count ++;

}

}

}


//...そしてそれらを組み合わせる..。

for(i = 0; i <merge_count; i ++)

{{

int target = merge1 [i];

int source = merge2 [i];


temp_hi [target] = MathMax(temp_hi [target]、temp_hi [source]);

temp_lo [target] = MathMin(temp_lo [target]、temp_lo [source]);

temp_hits[ターゲット]+=temp_hits[ソース];

temp_start [target] = MathMax(temp_start [target]、temp_start [source]);

temp_strength [target] = MathMax(temp_strength [target]、temp_strength [source]);

if(temp_hits [target]> 3)

temp_strength [target] = ZONE_PROVEN;


if(temp_hits [target] == 0 && temp_turn [target] == false)

{{

temp_hits [target] = 1;

if(temp_strength [target] <ZONE_VERIFIED)

temp_strength [target] = ZONE_VERIFIED;

}


if(temp_turn [target] == false || temp_turn [source] == false)

temp_turn [target] = false;

if(temp_turn [target] == true)

temp_hits [target] = 0;


temp_hits[ソース]=-1;

}

}

}


//リストの残りを公式ゾーンにコピーします

zone_count = 0;

for(i = 0; i <temp_count; i ++)

{{

if(temp_hits [i]> = 0 && zone_count <1000)

{{

zone_hi [zone_count] = temp_hi [i];

zone_lo [zone_count] = temp_lo [i];

zone_hits [zone_count] = temp_hits [i];

zone_turn [zone_count] = temp_turn [i];

zone_start [zone_count] = temp_start [i];

zone_strength [zone_count] = temp_strength [i];

if(zone_hi [zone_count] <Close [4])

zone_type [zone_count] = ZONE_SUPPORT;

else if(zone_lo [zone_count]> Close [4])

zone_type [zone_count] = ZONE_RESIST;

そうしないと

{{

for(j = 5; j <1000; j ++)

{{

if(iClose(NULL、TimeFrame、j)<zone_lo [zone_count])

{{

zone_type [zone_count] = ZONE_RESIST;

壊す;

}

else if(iClose(NULL、TimeFrame、j)> zone_hi [zone_count])

{{

zone_type [zone_count] = ZONE_SUPPORT;

壊す;

}

}


if(j == 1000)

zone_type [zone_count] = ZONE_SUPPORT;

}


zone_count ++;

}

}

}


void DrawZones()

{{

if(SetGlobals == true)

{{

GlobalVariableSet( "SSSR_Count _" + Symbol()+ TimeFrame、zone_count);

GlobalVariableSet( "SSSR_Updated _" + Symbol()+ TimeFrame、TimeCurrent());

}


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

{{

if(zone_strength [i] == ZONE_WEAK && zone_show_weak == false)

継続する;


string s = "SSSR#" + i + "Strength =";

if(zone_strength [i] == ZONE_PROVEN)

s = s + "実証済み、テストカウント=" + zone_hits [i];

else if(zone_strength [i] == ZONE_VERIFIED)

s = s + "検証済み、テストカウント=" + zone_hits [i];

else if(zone_strength [i] == ZONE_UNTESTED)

s = s+"未テスト";

else if(zone_strength [i] == ZONE_TURNCOAT)

s = s+"ターンコート";

そうしないと

s = s+"弱い";


ObjectCreate(s、 OBJ_RECTANGLE 、0、0、0、0、0);

ObjectSet(s、OBJPROP_TIME1、iTime(NULL、TimeFrame、zone_start [i]));

ObjectSet(s、OBJPROP_TIME2、TimeCurrent());

ObjectSet(s、OBJPROP_PRICE1、zone_hi [i]);

ObjectSet(s、OBJPROP_PRICE2、zone_lo [i]);

ObjectSet(s、OBJPROP_BACK、zone_solid);

ObjectSet(s、OBJPROP_WIDTH、zone_linewidth);

ObjectSet(s、OBJPROP_STYLE、zone_style);


if(zone_type [i] == ZONE_SUPPORT)

{{

//サポートゾーン

if(zone_strength [i] == ZONE_TURNCOAT)

ObjectSet(s、OBJPROP_COLOR、color_support_turncoat);

else if(zone_strength [i] == ZONE_PROVEN)

ObjectSet(s、OBJPROP_COLOR、color_support_proven);

else if(zone_strength [i] == ZONE_VERIFIED)

ObjectSet(s、OBJPROP_COLOR、color_support_verified);

else if(zone_strength [i] == ZONE_UNTESTED)

ObjectSet(s、OBJPROP_COLOR、color_support_untested);

そうしないと

ObjectSet(s、OBJPROP_COLOR、color_support_weak);

}

そうしないと

{{

//抵抗ゾーン

if(zone_strength [i] == ZONE_TURNCOAT)

ObjectSet(s、OBJPROP_COLOR、color_resist_turncoat);

else if(zone_strength [i] == ZONE_PROVEN)

ObjectSet(s、OBJPROP_COLOR、color_resist_proven);

else if(zone_strength [i] == ZONE_VERIFIED)

ObjectSet(s、OBJPROP_COLOR、color_resist_verified);

else if(zone_strength [i] == ZONE_UNTESTED)

ObjectSet(s、OBJPROP_COLOR、color_resist_untested);

そうしないと

ObjectSet(s、OBJPROP_COLOR、color_resist_weak);

}




if(SetGlobals == true)

{{

GlobalVariableSet( "SSSR_HI _" + Symbol()+ TimeFrame + i、zone_hi [i]);

GlobalVariableSet( "SSSR_LO _" + Symbol()+ TimeFrame + i、zone_lo [i]);

GlobalVariableSet( "SSSR_HITS _" + Symbol()+ TimeFrame + i、zone_hits [i]);

GlobalVariableSet( "SSSR_STRENGTH _" + Symbol()+ TimeFrame + i、zone_strength [i]);

GlobalVariableSet( "SSSR_AGE _" + Symbol()+ TimeFrame + i、zone_start [i]);

}

}

}


boolフラクタル(int M、int P、intシフト)

{{

if(TimeFrame> P)

P=時間枠;

P = P / TimeFrame * 2 + MathCeil(P / TimeFrame / 2);

if(shift <p)

return(false);


if(shift> iBars(Symbol()、TimeFrame)-P)

return(false);

for(int i = 1; i <= P; i ++)

{{

if(M == UP_POINT)

{{

if(iHigh(NULL、TimeFrame、shift + i)> iHigh(NULL、TimeFrame、shift))

return(false);

if(iHigh(NULL、TimeFrame、shift-i)> = iHigh(NULL、TimeFrame、shift))

return(false);

}

if(M == DN_POINT)

{{

if(iLow(NULL、TimeFrame、shift + i)<iLow(NULL、TimeFrame、shift))

return(false);

if(iLow(NULL、TimeFrame、shift-i)<= iLow(NULL、TimeFrame、shift))

return(false);

}

}

return(true);

}


void FastFractals()

{{

int-shift;

int limit = MathMin(Bars-1、BackLimit);

int P = TimeFrame * fractal_fast_factor;


FastUpPts [0] = 0.0; FastUpPts [1] = 0.0;

FastDnPts [0] = 0.0; FastDnPts [1] = 0.0;


for(shift = limit; shift> 1; shift--)

{{

if(Fractal(UP_POINT、P、shift)== true)

FastUpPts [shift] = iHigh(NULL、TimeFrame、shift);

そうしないと

FastUpPts [shift] = 0.0;


if(Fractal(DN_POINT、P、shift)== true)

FastDnPts [shift] = iLow(NULL、TimeFrame、shift);

そうしないと

FastDnPts [shift] = 0.0;

}

}


void SlowFractals()

{{

int-shift;

int limit = MathMin(iBars(Symbol()、TimeFrame)-1、BackLimit);

int P = TimeFrame * fractal_slow_factor;


SlowUpPts [0] = 0.0; SlowUpPts [1] = 0.0;

SlowDnPts [0] = 0.0; SlowDnPts [1] = 0.0;


for(shift = limit; shift> 1; shift--)

{{

if(Fractal(UP_POINT、P、shift)== true)

SlowUpPts [shift] = iHigh(NULL、TimeFrame、shift);

そうしないと

SlowUpPts [shift] = 0.0;


if(Fractal(DN_POINT、P、shift)== true)

SlowDnPts [shift] = iLow(NULL、TimeFrame、shift);

そうしないと

SlowDnPts [shift] = 0.0;

}

}


bool NewBar()

{{

static datetime LastTime = 0;

if(iTime(NULL、TimeFrame、0)!= LastTime)

{{

LastTime = iTime(NULL、TimeFrame、0)+ time_offset;

return(true);

}

そうしないと

return(false);

}


void DeleteZones()

{{

intlen = 5;

int i;


while(i <ObjectsTotal())

{{

文字列objName=ObjectName(i);

if(StringSubstr(objName、0、len)!= "SSSR#")

{{

i ++;

継続する;

}

ObjectDelete(objName);

}

}


string TimeFrameToString(int tf)//TROからのコード

{{

文字列tfs;


switch(tf)

{{

ケースPERIOD_M1:

tfs = "M1";

壊す;

ケースPERIOD_M5:

tfs = "M5";

壊す;

ケースPERIOD_M15:

tfs = "M15";

壊す;

ケースPERIOD_M30:

tfs = "M30";

壊す;

ケースPERIOD_H1:

tfs = "H1";

壊す;

ケースPERIOD_H4:

tfs = "H4";

壊す;

ケースPERIOD_D1:

tfs = "D1";

壊す;

ケースPERIOD_W1:

tfs = "W1";

壊す;

ケースPERIOD_MN1:

tfs = "MN";

}


return(tfs);

}


string StringRepeat(string str、int n = 1)

{{

string outstr = "";

for(int i = 0; i <n; i ++)outstr = outstr + str;

return(outstr);

}


string StringRightPad(string str、int n = 1、string str2 = "")

{{

return(str + StringRepeat(str2、n-StringLen(str)));


 

MT5への乗り換え。一言お願いします。MT5ではどのようにコードで書かれているのですか、何が間違っているのですか?

//+------------------------------------------------------------------+
//|                                                          123.mq5 |
//|                        Copyright 2019, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   1
//+----------------------------------------------+
//|  Параметры отрисовки индикатора 1            |
//+----------------------------------------------+
#property indicator_type1   DRAW_ARROW
#property indicator_color1  Blue
#property indicator_style1  STYLE_DASHDOTDOT
#property indicator_width1  0
#property indicator_label1  "Label 1"
//----
input int MAPeriod=13;
//---=
int handle_ma;
double ExtLineBuffer[];
double BufferPrice[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   SetIndexBuffer(0,ExtLineBuffer,INDICATOR_DATA);
   SetIndexBuffer(3,BufferPrice,INDICATOR_CALCULATIONS);
//---- символы для индикатора
   PlotIndexSetInteger(0,PLOT_ARROW,108);
//---- создание метки для отображения в DataWindow
   PlotIndexSetString(0,PLOT_LABEL,"PROBA");
//----
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
   IndicatorSetString(INDICATOR_SHORTNAME," 123");
//---- массива будет производиться как в таймсериях
   ArraySetAsSeries(ExtLineBuffer,true);
   ArraySetAsSeries(BufferPrice,true);
//--- create MA's handles
   ResetLastError();
      handle_ma=iMA(NULL,Period(),MAPeriod,0,MODE_SMA,PRICE_CLOSE); 
   if(handle_ma==INVALID_HANDLE)
     {
      Print("The iMA (1) object was not created: Error ",GetLastError());
      return INIT_FAILED;
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 | 
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
 {
 Comment("");
 }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
//--- Проверка количества доступных баров
   if(rates_total<4) return 0;
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated;
   if(limit>1)
     {
      limit=rates_total-1;
   ArrayInitialize(ExtLineBuffer,EMPTY_VALUE);
   ArrayInitialize(BufferPrice,0);
     }
//--- Подготовка данных
   int count=(limit>1 ? rates_total : 2),copied=0;
   copied=CopyBuffer(handle_ma,0,0,count,BufferPrice);
   if(copied!=count) return 0;
//----   
 for(int i=limit; i>0 && !IsStopped(); i--)
   {
//----------------------------------------- ОСНОВНОЙ МОДУЛЬ КОТОРЫЙ НЕ РАБОТАЕТ ----------------------------
 if(PERIOD_H1==Period())
  {
//--- High signal
 if(BufferPrice[i]>open[i] && BufferPrice[i]<close[i])   
   ExtLineBuffer[i]=high[i];
//--- Low signal
 if(BufferPrice[i]<open[i] && BufferPrice[i]>close[i])
   ExtLineBuffer[i]=low[i];
  } /*
  else
  {
  ExtLineBuffer[i]=0.0;
  ExtLineBuffer[i]=0.0;
  } */
  }    
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

質問:なぜ、バッファにいろいろなゴミが落ちているのですか?

今はレゴコンストラクター、つまりモジュールをコピーしてMT5の特性を体感的に理解しようとする段階です。コースのドキュメント

 
kopeyka2:

MT5への乗り換え。一言お願いします。MT5ではどのようにコードで書かれているのですか、何が間違っているのですか?

QUESTION: なぜ、いろいろなゴミがバッファに落ちているのでしょうか?

mt5 の時系列は逆になっています
もし mt4 と同じ方法で必要なら、ArraySetAsSeries を使用します。

 
kopeyka2:

MT5への乗り換え。一言お願いします。MT5ではどのようにコードで書かれているのですか、何が間違っているのですか?

質問:なぜ、バッファにいろいろなゴミが落ちているのですか?

今はレゴコンストラクターの段階、つまりモジュールをコピーしてMT%のクセを体感的に理解している段階です。コースのドキュメント

//+------------------------------------------------------------------+
//|                                                          123.mq5 |
//|                        Copyright 2019, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   1
//+----------------------------------------------+
//|  Параметры отрисовки индикатора 1            |
//+----------------------------------------------+
#property indicator_type1   DRAW_ARROW
#property indicator_color1  clrBlue
#property indicator_width1  1
#property indicator_label1  "Label 1"
//----
input int MAPeriod=13;
//---=
int handle_ma;
double ExtLineBuffer[];
double BufferPrice[];
//---
int    period;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   period=(MAPeriod<1 ? 1 : MAPeriod);
//---
   SetIndexBuffer(0,ExtLineBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,BufferPrice,INDICATOR_CALCULATIONS);
//---- символы для индикатора
   PlotIndexSetInteger(0,PLOT_ARROW,108);
//---- создание метки для отображения в DataWindow
   PlotIndexSetString(0,PLOT_LABEL,"PROBA");
//----
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
   IndicatorSetString(INDICATOR_SHORTNAME," 123");
//---- массива будет производиться как в таймсериях
   ArraySetAsSeries(ExtLineBuffer,true);
   ArraySetAsSeries(BufferPrice,true);
//--- create MA's handles
   ResetLastError();
   handle_ma=iMA(NULL,PERIOD_CURRENT,period,0,MODE_SMA,PRICE_CLOSE);
   if(handle_ma==INVALID_HANDLE)
     {
      Print("The iMA (",(string)period,") object was not created: Error ",GetLastError());
      return INIT_FAILED;
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 | 
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//--- 
   ArraySetAsSeries(high,true);
   ArraySetAsSeries(low,true); 
//--- Проверка количества доступных баров
   if(rates_total<4) return 0;
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated;
   if(limit>1)
     {
      limit=rates_total-1;
      ArrayInitialize(ExtLineBuffer,EMPTY_VALUE);
      ArrayInitialize(BufferPrice,0);
     }
//--- Подготовка данных
   int count=(limit>1 ? rates_total : 2),copied=0;
   copied=CopyBuffer(handle_ma,0,0,count,BufferPrice);
   if(copied!=count) return 0;
//----   
   for(int i=limit; i>=0 && !IsStopped(); i--)
     {
      //----------------------------------------- ОСНОВНОЙ МОДУЛЬ КОТОРЫЙ НЕ РАБОТАЕТ ----------------------------
      if(Period()==PERIOD_H1)
        {
         //--- High signal
         if(BufferPrice[i]>open[i] && BufferPrice[i]<close[i])
            ExtLineBuffer[i]=high[i];
         //--- Low signal
         if(BufferPrice[i]<open[i] && BufferPrice[i]>close[i])
            ExtLineBuffer[i]=low[i];
        }
/*
  else
  {
  ExtLineBuffer[i]=0.0;
  ExtLineBuffer[i]=0.0;
  } */
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Artyom Trishkin:

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

MT5で確認したところ...なんということでしょう・・・。ポイントがチャートのあちこちに妙に散らばっている、どこか歴史の深いところにあるような...。私は何を、なぜMT5が好きではないのか理解できないのですか?問題は簡単です!!!

MT4で取る

.mt4ではこのように表示されます。


MT5でもそうです。もちろん1つのバッファーで。ただ、問題は、インジケータがポイントをキャッチしているのに、あれもダメ、これもダメということです・・・((


また教えてください。MT5のコードに何か間違いがあったのでしょうか?

MT5で何か出た。しかし、バッファー ...なぞなぞ

 
kopeyka2:

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

MT5で確認したところ...なんということでしょう・・・。ポイントがチャートのあちこちに妙に散らばっている、どこか歴史の深いところにあるような...。私は何を、なぜMT5が好きではないのか理解できないのですか?問題は簡単です!!!

MT4で取る

.


というように、mt5では .もちろん1つのバッファーで。ただ、問題は、インジケータがポイントをキャッチしているのに、あれもダメ、これもダメということです・・・((


またよろしくお願いします。MT5のコードに何か間違いがあったのでしょうか?

MT5で何か出た。しかし、バッファー ...なぞなぞ

謎はない。mql4とはナンバリングが異なり、インジケータ・バッファは 自動的にゼロになりません。ゴミ」を片付けるために、プログラマはインデックスに値が含まれないように、インデックスの清浄度に気をつけなければなりません。

 
Alexey Viktorov:

謎はない。mql4とはナンバリングが異なり、インジケータ・バッファは 自動的にゼロになりません。ゴミ」を片付けるために、プログラマはインデックスに値が含まれないようにするために、インデックスの純度に気をつけなければなりません。

問題は、なぜマーク(点)がどこに置かれているのか、ということです。コードでアルゴリズムを定義しました!!!!ローソク足本体のMA条件。これだけでは不十分なのでしょうか?

 
kopeyka2:

問題は、なぜマーク(点)がどこに置かれているのか、ということです。コードでアルゴリズムを定義しました!!!!ローソク足本体のMA条件。これだけでは不十分なのでしょうか?

ほら、見てください。

kopeyka2 さん
MT5への乗り換え。 一言、助けてください。


アルテムは、ヘルプという言葉ではなく、完全なコードを示しました。アプローチの仕方は人それぞれ。出来合いのコードは渡さないようにしているのですが、それでも時々失敗してしまいます。

kopeyka2 さん

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

MT5で確認したところ...ちょっとごちゃごちゃしてますね...。


しかし、比較のためのグラフは全く別の時間帯のものです。ドットの正誤はどう判断すればいいのか?

それゆえ、一言で言えば「助かる」のです。

トレーディング、自動売買システム、ストラテジーテストに関するフォーラム

MQL4初心者の質問、ヘルプ、アルゴリズムやコードに関するディスカッションなど何でもOK

アレクセイ・ビクトロフ 2019.01.21 11:04

謎はない。mql4とはナンバリングが異なり、インジケータバッファは 自動でゼロになるわけではありません。ゴミ」を片付けるために、もしインデックスに値が含まれないとしたら、プログラマー自身がインデックスのクリーンさに気を配る必要があります。

ヘルプ: MT5では、OnInitとOnDeinitの実行順序が不適切なため、問題が発生する可能性があります。しかし、それは一部の特殊なケースであり、指標の再計算は常に連続して行われる必要があります。prev_calculated == 0 の場合,すべてのバーで再計算し,ループの各繰り返しにおいて,バッファに値がない場合,配列のこのインデックスを PLOT_EMPTY_VALUE の設定に従って EMPTY_VALUE または 0 で埋めます.
 
Alexey Viktorov:

ここでは、その様子をご紹介します。

アルティオムは、言葉の助けの代わりに、完全な暗号を与えた。アプローチの仕方は人それぞれです。既成のコードは与えないようにしていますが、それでも失敗することがあります。

しかし、比較のためのグラフは全く別の時間帯のものです。その指摘が正しいか間違っているかは、どのように判断すればよいのでしょうか。

それゆえ、一言で言えば「助かる」のです。

MT5では、OnInitとOnDeinitの実行順序が不適切であったため、問題が発生する可能性があります。しかし、それは特殊なケースであり、指標の再計算は常に連続して行われる必要があります。prev_calculated == 0 の場合,すべてのバーで再計算し,ループの各繰り返しにおいて,バッファに値がない場合,配列のこのインデックスを PLOT_EMPTY_VALUE の設定に従って EMPTY_VALUE または 0 で埋めます.

ハレルヤ!! open[i]とclose[i]をiOpen(NULL,PERIOD_H1,i)に変更しました。



 
kopeyka2:

ハレルヤ!! open[i]とclose[i]をiOpen(NULL,PERIOD_H1,i)に変更しました。



何が違うの?インジケータがH1、アクセス速度のみ点灯している場合 - 低速のものがあります。私の例では、配列のopenとcloseをシリアルインデックスに設定する必要があることを、おそらく見逃していたでしょう。あなたが持っていないものを強調しました。最初から最後まで、つまり限界から0までのループがあり、配列のインデックスを 付けなかったため、前後逆に描画されてしまったのですね。