Речь идет об области видимости и последнем установленном значении. Все эти переменные имеют область видимости по крайней мере той функции, в которой они находятся, если они объявлены глобально, то они имеют область видимости за пределами функции. Если значение переменной меняется 3 раза в цикле, вы не сможете получить второе значение, в которое она была установлена, извне цикла, потому что к моменту выполнения кода вне цикла переменная будет установлена в третье значение.
И допустим, я объявляю val1 со сдвигом 3 и затем цикл, конечно, со сдвигом i
Если я ссылаюсь на val1 вне цикла, буду ли я говорить о val1 global или val1 looped?
Я думаю, мне интересно, должен ли я добавить отдельный глобальный фрактал для моих операторов if, таких как val3 и val4 или что-то еще
Я вроде как застрял здесь, но похоже, что схема ABCD по крайней мере делает небольшой прогресс
В общем, вот код, есть идеи?
//+------------------------------------------------------------------+//| Agent86_5min.mq4 |//| Unfinished POS |//| my attempt at an ABCD scheme and fib retrace | //+------------------------------------------------------------------+#property copyright "Unfinished POS by Agent86"//---- input parametersexterndouble TakeProfit=20.0;
externdouble Lots=0.1;
externdouble StopLoss=10.0;
externint MagicNumber=123486;
double val1;
double val2;
//++++ These are adjusted for 5 digit brokers.int pips2points; // slippage 3 pips 3=points 30=pointsdouble pips2dbl; // Stoploss 15 pips 0.0015 0.00150intDigits.pips; // DoubleToStr(dbl/pips2dbl, Digits.pips)// OrderSend(... Slippage.Pips * pips2points, Bid - StopLossPips * pips2dbl//+------------------------------------------------------------------+//| expert initialization function |//+------------------------------------------------------------------+int init()
{
if (Digits == 5 || Digits == 3)
{ // Adjust for five (5) digit brokers.
pips2dbl = Point*10; pips2points = 10; Digits.pips = 1;
}
else
{
pips2dbl = Point; pips2points = 1; Digits.pips = 0;
}
// OrderSend(... Slippage.Pips * pips2points, Bid - StopLossPips * pips2dbl//---- //----return(0);
}
//+------------------------------------------------------------------+//| expert deinitialization function |//+------------------------------------------------------------------+int deinit()
{
//---- //----return(0);
}
//+------------------------------------------------------------------+//| expert start function |//+------------------------------------------------------------------+int start()
{
int i=0;
val1=iFractals(NULL, 0, MODE_UPPER,3);
val2=iFractals(NULL, 0, MODE_LOWER,3);
for(i=0; val1==0 || val2==0; i++)
{
if(iFractals(NULL, 0, MODE_UPPER,i) > 0 && val1 == 0)
val1 = iFractals(NULL, 0, MODE_UPPER, i);
if(iFractals(NULL, 0, MODE_LOWER, i) > 0 && val2 == 0)
val2 = iFractals(NULL, 0, MODE_LOWER, i);
double A = val2;
if(A !=0)
Print (A, " A loop down");
double a = val1;
if(a !=0)
Print (a, " a loop up");
//Print (" Last UPPER Fractal at ", val1, " Last LOWER Fractal at ", val2);
}
if(val1 > 0)
{
//Print (val1, " val1");//Print(TimeToStr(Time[3],TIME_DATE|TIME_MINUTES), " = val1 time"); //datetime b = Time[3];////Print (A, " A if");double Z=(val1-A)/2; //my attempt at a .50 retrace in pips but can be any fib leveldouble C=A+Z; //using the calc above to get the retrace value at .50//Print (C, " C");if(Bid<=C && Bid > A) //C will be somewhere in between herePrint (Low[0], " Low [0] ", C, " = C");
// some other signal here to trade at retrace
}
if(val2 < 0)
{
//Print (val2, " val2");//Print(TimeToStr(Time[3],TIME_DATE|TIME_MINUTES), " = val2 time");//datetime c = Time[3];//Print(a, " a");double z=(a-val2)/2; //my attempt at a .50 retrace in pips but can be any fib leveldouble c=a+z; //using the calc above to get the retrace value at .50//Print (c, " c");if(Bid<=c && c < a) //c will be somewhere in between herePrint (Low[0], " Low [0] ", c, " = c");
//some other signal here to trade at retrace
}
return(0);
}
//+------------------------------------------------------------------+
Итак, A будет предыдущим минимумом, а val1 должен быть текущим сдвигом 3, и то же самое с a и val2
Мне нужно еще раз проверить, что A и a относятся к правильным значениям, потому что я добавил операторы !=0, чтобы не выводить пустые значения. На первый взгляд, все в порядке, но мне нужно еще раз подтвердить это
Как бы то ни было, переформулируем это: Является ли val1 в моем if(statement) правильной ссылкой на правильное условие или мне нужен совершенно другой iFractal для ссылки на сдвиг 3 Я не могу сказать, работает ли это правильно или нет, кажется, что работает, но что-то кажется неправильным, и я не могу указать на это.
Пожалуйста, посоветуйте.
Спасибо
Хотя это действительно больше не тема индикатора, я должен переместить это в новую тему?
val1 и val2 внутри или вне цикла имеют последнее значение, которое им было присвоено ... это происходит до цикла, а затем значения могут быть изменены внутри цикла ... после выхода из цикла значения становятся теми, какие они есть, и остаются такими до следующего вызова start(), затем они сбрасываются и, возможно, изменяются в цикле ... и т.д. и т.п.
val1 и val2 объявлены в глобальной области видимости, i объявлено локально в start().
val1 и val2 внутри или вне цикла имеют последнее значение, которое им было присвоено ... это происходит до цикла, а затем значения могут быть изменены внутри цикла ... после выхода из цикла значения являются теми, какие они есть, и остаются такими до следующего вызова start(), затем они сбрасываются и затем, возможно, изменяются в цикле ... и т.д. и т.п.
Хммм, так что решения решениями.
Я мог бы попробовать пойти за значениями, находясь в цикле, и просто заново объявить val1 и val2 =iFractal,,,3 снова. Чтобы сбросить все, но только после того, как я объявлю A=val2 и a=val1, чтобы у меня было значение для них, которое, надеюсь, будет моим предыдущим фракталом, если я все правильно понял.
Или я могу заново объявить val 1 и val2 вне цикла, но я не хочу потерять значение для A или a, так что я просто должен сделать это в нужное время, я думаю.
Возможно, я делаю все это неправильно, но неважно. Нужно с чего-то начинать, поэтому я выбрал этот вариант на данный момент; и я смогу его скорректировать по мере накопления опыта.
Я предполагаю, что мне, вероятно, следует изменить их на val3 и val4, чтобы использовать фактический iFractal для торговли и только ссылаться и использовать (A) и (a) для ссылки на мой предыдущий фрактал.
После нескольких дней размышлений и попыток проработать логику, я думаю, что у меня есть лучший рабочий код, хотя и не идеальный, но прогресс налицо.
//+------------------------------------------------------------------+//| Agent86_5min.mq4 |//| Unfinished POS slate |//| See progress notes below |
//+------------------------------------------------------------------+#property copyright "Unfinished POS slate by Agent86"//---- input parametersexterndouble TakeProfit=20.0;
externdouble Lots=0.1;
externdouble StopLoss=10.0;
externint MagicNumber=123486;
double val1;
double val2;
bool traded = false;
//++++ These are adjusted for 5 digit brokers.int pips2points; // slippage 3 pips 3=points 30=pointsdouble pips2dbl; // Stoploss 15 pips 0.0015 0.00150intDigits.pips; // DoubleToStr(dbl/pips2dbl, Digits.pips)// OrderSend(... Slippage.Pips * pips2points, Bid - StopLossPips * pips2dbl//+------------------------------------------------------------------+//| expert initialization function |//+------------------------------------------------------------------+int init()
{
if (Digits == 5 || Digits == 3)
{ // Adjust for five (5) digit brokers.
pips2dbl = Point*10; pips2points = 10; Digits.pips = 1;
}
else
{
pips2dbl = Point; pips2points = 1; Digits.pips = 0;
}
// OrderSend(... Slippage.Pips * pips2points, Bid - StopLossPips * pips2dbl//---- //----return(0);
}
//+------------------------------------------------------------------+//| expert deinitialization function |//+------------------------------------------------------------------+int deinit()
{
//---- //----return(0);
}
//+------------------------------------------------------------------+//| expert start function |//+------------------------------------------------------------------+int start()
{
int i=0;
int ticket,total,result;
total = OrdersTotal();
val1=iFractals(NULL, 0, MODE_UPPER,3);
val2=iFractals(NULL, 0, MODE_LOWER,3);
if(val1 > 0 && traded == false)
{
// in the absence of an && indicator above I get continous print statements// with indicator added && indicator above, then it prints A and B once as it should ???// I need to work this out so it won't print all the time aka trade all the time// A and B first values seems to initialize the whole block// just a reminder that they time stamps coordinate after this FYI// now work on C retrace and possibly signals// add options for user to select some candle patterns// add options to select indicators// add bells and whistles to make things fun// alerts,sounds,maybe poppup video animation or somethingdouble B = val1;
Print(B, " B high");
if(val2==0)
{
for (i=0; val2==0; i++)
{
val2=iFractals(NULL, 0, MODE_LOWER, i);
double A = val2;
if(A!=0)
{
Print(A, " A low");
}
}
}
traded=true;
}
if(val2 > 0 && traded == true)
{
B = val2;
Print(B, " B low");
if(val1==0)
{
for (i=0; val1==0; i++)
{
val1=iFractals(NULL, 0, MODE_UPPER, i);
A = val1;
if(A!=0)
{
Print(A, " A high");
}
}
}
traded=false;
}
return(0);
}
//+------------------------------------------------------------------+
Итак, у меня есть значения A и B, и если в начальном if(statements && indicators) стоит индикатор, то значения выводятся один раз, например, MACD быстрее > медленнее или что-то подобное.
Таким образом, я получаю только A и B, как мне хотелось бы.
Я не уверен, почему он печатает несколько раз, когда опции индикатора убраны из моих if(statements).
В любом случае, я немного приблизился к этой схеме типа ABCD, которая может быть использована и для других индикаторов, а не только для фракталов и т.д. На будущее.
Это может помочь вам. Это индикатор для доступа к последним фракталам и сдвигу, который вы можете использовать для разработки ABCD.
Это даст верхние фракталы. Измените "" на "L" для нижних фракталов.
Это даст фрактал перед последним фракталом.
Да, я вижу, что
До моего последнего кода в этой теме я разработал несколько различных (for) операторов с некоторой помощью, и это также было индикатором, я смог нарисовать то, что я хотел в буфере, однако это привело меня к другой проблеме попытки извлечения значений и печати этих значений только один раз для использования или ссылки.
Поскольку эти различные операторы for вызывают у меня проблемы, и они похожи на код, который вы опубликовали. Я никогда не мог получить значения без постоянной печати значения каждый раз, когда оно становится истинным, что происходит постоянно. Я немного разобрался с этим, но так и не понял, как остановиться, когда условие становится истинным.
Я вижу в вашем коде одну вещь, которая может помочь, это блок static datetime, и я использовал его только один раз, чтобы ссылаться на условие только тогда, когда приходит новый бар и новое время бара. Эта часть может быть полезна для того, над чем я работаю. И хотя мой текущий код выводит текущий фрактал и предыдущий фрактал, в настоящее время он работает.
Единственная проблема, с которой я сталкиваюсь, заключается в том, что как только условие становится истинным, он печатает заявление непрерывно, что может быть нормально, но это означает, что он также, вероятно, будет постоянно размещать сделку, как только я доберусь до этой точки.
Возможно, мне нужно больше опыта в использовании индикаторов iCustom, и это могло бы решить многие мои проблемы, но я еще не так далеко в своем обучении.
Я просмотрю этот код еще раз, и части EMPTY_VALUE. Теперь, когда я вижу, как это используется, я могу научиться и этому. Это было предложено раньше, но я так и не понял, как это использовать.
Я буду продолжать работать над этим. Спасибо за помощь
И последнее, я заметил, что когда я добавляю, скажем, MACD к if(val1 > 0 && faster > slower && traded == false)
Тогда он работает и выдает только то, что я хочу - печатает A low, B high, затем и/или B low и A high
.
Но если я уберу быстрее > медленнее и быстрее < медленнее в обоих этих операторах if, то я замечу, что он НИКОГДА не печатает максимум A, а также постоянно печатает остальные, что меня смущает.
Я продолжу работу, я уверен, что мне нужно заставить его печатать утверждение один раз без других утверждений индикаторов в советнике, чтобы я знал, что индикаторы не будут вмешиваться в ABCD части кода
Я думаю, ваша проблема в том, что вы не сбросили значения val1 и val2. Поэтому, как только вы нашли максимум и последний минимум, вам нужно сбросить их:
double B = val1;
Print(B, " B high");
if(val2==0)
{
for (i=0; val2==0; i++)
{
//Print("i "+i);
val2=iFractals(NULL, 0, MODE_LOWER, i);
double A = val2;
if(A!=0)
{
Print(A, " A low");
}
}
}
traded=true;
}
val1=iFractals(NULL, 0, MODE_UPPER,3);
val2=iFractals(NULL, 0, MODE_LOWER,3);
if(val2 > 0 && traded == true)
{
B = val2;
Print(B, " B low");
if(val1==0)
{
for (i=0; val1==0; i++)
{
val1=iFractals(NULL, 0, MODE_UPPER, i);
A = val1;
if(A!=0)
{
Print(A, " A high");
}
}
}
traded=false;
}
И допустим, я объявляю val1 со сдвигом 3
и затем цикл, конечно, со сдвигом i
Если я ссылаюсь на val1 вне цикла, буду ли я говорить о val1 global или val1 looped?
Я думаю, мне интересно, должен ли я добавить отдельный глобальный фрактал для моих операторов if, таких как val3 и val4 или что-то еще
Я вроде как застрял здесь, но похоже, что схема ABCD по крайней мере делает небольшой прогресс
В общем, вот код, есть идеи?
Итак, A будет предыдущим минимумом, а val1 должен быть текущим сдвигом 3, и то же самое с a и val2
Мне нужно еще раз проверить, что A и a относятся к правильным значениям, потому что я добавил операторы !=0, чтобы не выводить пустые значения.
На первый взгляд, все в порядке, но мне нужно еще раз подтвердить это
Как бы то ни было, переформулируем это:
Является ли val1 в моем if(statement) правильной ссылкой на правильное условие или мне нужен совершенно другой iFractal для ссылки на сдвиг 3
Я не могу сказать, работает ли это правильно или нет, кажется, что работает, но что-то кажется неправильным, и я не могу указать на это.
Пожалуйста, посоветуйте.
Спасибо
Хотя это действительно больше не тема индикатора, я должен переместить это в новую тему?
Если я использую что-то вроде этого
И допустим, я объявляю val1 со сдвигом 3
а затем в цикле, конечно, со сдвигом i.
Если я обращусь к val1 вне цикла, буду ли я говорить о val1 глобальном или val1 зацикленном?
Наверное, мне интересно, должен ли я добавить отдельный глобальный фрактал для моих операторов if, таких как val3 и val4, или что-то еще.
val1 и val2 объявлены в глобальной области видимости, i объявлен локально в start().
val1 и val2 внутри или вне цикла имеют последнее значение, которое им было присвоено ... это происходит до цикла, а затем значения могут быть изменены внутри цикла ... после выхода из цикла значения становятся теми, какие они есть, и остаются такими до следующего вызова start(), затем они сбрасываются и, возможно, изменяются в цикле ... и т.д. и т.п.
val1 и val2 объявлены в глобальной области видимости, i объявлено локально в start().
val1 и val2 внутри или вне цикла имеют последнее значение, которое им было присвоено ... это происходит до цикла, а затем значения могут быть изменены внутри цикла ... после выхода из цикла значения являются теми, какие они есть, и остаются такими до следующего вызова start(), затем они сбрасываются и затем, возможно, изменяются в цикле ... и т.д. и т.п.
Я мог бы попробовать пойти за значениями, находясь в цикле, и просто заново объявить val1 и val2 =iFractal,,,3 снова. Чтобы сбросить все, но только после того, как я объявлю A=val2 и a=val1, чтобы у меня было значение для них, которое, надеюсь, будет моим предыдущим фракталом, если я все правильно понял.
Или я могу заново объявить val 1 и val2 вне цикла, но я не хочу потерять значение для A или a, так что я просто должен сделать это в нужное время, я думаю.
Возможно, я делаю все это неправильно, но неважно. Нужно с чего-то начинать, поэтому я выбрал этот вариант на данный момент; и я смогу его скорректировать по мере накопления опыта.
Спасибо за помощьЯ предполагаю, что мне, вероятно, следует изменить их на val3 и val4, чтобы использовать фактический iFractal для торговли и только ссылаться и использовать (A) и (a) для ссылки на мой предыдущий фрактал.
Я буду продолжать работать над этим.
Спасибо
После нескольких дней размышлений и попыток проработать логику, я думаю, что у меня есть лучший рабочий код, хотя и не идеальный, но прогресс налицо.
Итак, у меня есть значения A и B, и если в начальном if(statements && indicators) стоит индикатор, то значения выводятся один раз, например, MACD быстрее > медленнее или что-то подобное.
Таким образом, я получаю только A и B, как мне хотелось бы.
Я не уверен, почему он печатает несколько раз, когда опции индикатора убраны из моих if(statements).
В любом случае, я немного приблизился к этой схеме типа ABCD, которая может быть использована и для других индикаторов, а не только для фракталов и т.д. На будущее.
Пожалуйста, посоветуйте
Спасибо
Это может помочь вам. Это индикатор для доступа к последним фракталам и сдвигу, который вы можете использовать для разработки ABCD.
Это даст верхние фракталы. Измените "" на "L" для нижних фракталов.
Это даст фрактал перед последним фракталом.
Это может помочь вам. Это индикатор для доступа к последним фракталам и сдвигу, который вы можете использовать для разработки ABCD.
Это даст верхние фракталы. Измените "" на "L" для нижних фракталов.
Это даст фрактал перед последним фракталом.
До моего последнего кода в этой теме я разработал несколько различных (for) операторов с некоторой помощью, и это также было индикатором, я смог нарисовать то, что я хотел в буфере, однако это привело меня к другой проблеме попытки извлечения значений и печати этих значений только один раз для использования или ссылки.
Поскольку эти различные операторы for вызывают у меня проблемы, и они похожи на код, который вы опубликовали.Я никогда не мог получить значения без постоянной печати значения каждый раз, когда оно становится истинным, что происходит постоянно.
Я немного разобрался с этим, но так и не понял, как остановиться, когда условие становится истинным.
Я вижу в вашем коде одну вещь, которая может помочь, это блок static datetime, и я использовал его только один раз, чтобы ссылаться на условие только тогда, когда приходит новый бар и новое время бара.
Эта часть может быть полезна для того, над чем я работаю. И хотя мой текущий код выводит текущий фрактал и предыдущий фрактал, в настоящее время он работает.
Единственная проблема, с которой я сталкиваюсь, заключается в том, что как только условие становится истинным, он печатает заявление непрерывно, что может быть нормально, но это означает, что он также, вероятно, будет постоянно размещать сделку, как только я доберусь до этой точки.
Возможно, мне нужно больше опыта в использовании индикаторов iCustom, и это могло бы решить многие мои проблемы, но я еще не так далеко в своем обучении.
Я просмотрю этот код еще раз, и части EMPTY_VALUE. Теперь, когда я вижу, как это используется, я могу научиться и этому. Это было предложено раньше, но я так и не понял, как это использовать.
Я буду продолжать работать над этим.
Спасибо за помощь
Тогда он работает и выдает только то, что я хочу - печатает A low, B high, затем и/или B low и A high
.
Но если я уберу быстрее > медленнее и быстрее < медленнее в обоих этих операторах if, то я замечу, что он НИКОГДА не печатает максимум A, а также постоянно печатает остальные, что меня смущает.
Я продолжу работу, я уверен, что мне нужно заставить его печатать утверждение один раз без других утверждений индикаторов в советнике, чтобы я знал, что индикаторы не будут вмешиваться в ABCD части кода
Назад к чертежной доске.
Я думаю, ваша проблема в том, что вы не сбросили значения val1 и val2. Поэтому, как только вы нашли максимум и последний минимум, вам нужно сбросить их:
Надеюсь, это поможет.