Помощь в кодировании - страница 73

 

Здравствуйте,

Я надеюсь, что кто-нибудь сможет помочь заставить индикатор делать то, что я хочу, чтобы он делал.

У меня есть индикатор, который показывает длину тела / или общую длину свечи, плюс время бара свечи.

Единственное, он не подходит для 5-значных брокеров, время и длина проецируются друг на друга, в то время как в 4-значных все идеально.

Было бы очень хорошо, если бы кто-то смог и захотел изменить код.

Заранее спасибо,

С уважением,

Бен

 

Не хватает чего-то простого

Я работал над TL-фильтром для советника MA cross EA, любого MA cross EA, но прикрепляю его в приложении, так как он простой.

В основном калькулятор TL дает сигналы 1, 2 или 3 в зависимости от направления TL и пересечения цены и неприятный "нулевой делитель", если TL недостаточно наклонен.

Я учусь кодированию и прочитал все PDF-файлы Coders' Guru и столько из форума MQL4, сколько мой мозг может принять, но так как я медленно учусь и ничего не кодировал до 3 недель назад.....

Ищу некоторые подсказки....

Проблема: Я не могу понять, как вызвать значение "TLfilter", которое равно 3, когда цена не коснулась TL и можно делать Buy.

Я пытался вставить его в критерии покупки / продажи как &&TTLfilter = 3!, и любые другие методы, которые я могу придумать, но все, что я получаю, это отсутствие сделок вообще.

Также я пытался вставить его в цикл OrderSelect, но безуспешно.

Просто ищу подсказки, что я упускаю.

Если кому-то интересно, посмотрите.

Нарисуйте TL на графике перед подключением советника и назовите его t6.

Откомментируйте //--- Print ("TLfilter = ",TLfilter); return(TLfilter); внизу секции TL, чтобы увидеть, что он делает.

Модификации к этому советнику отмечены двойной линией ======= 1 2 и 3.

Edit: В этом модуле нет моего кода, так как хотелось убедиться, что он максимально чист x_trader_v2_tlmod.mq4

Файлы:
 

мультииндикатор

Привет!

Кто-нибудь использует/имеет подобный мультииндикатор?

Мульти скользящая средняя - База кодов MQL4

Если вы видите внизу, это похоже на индикатор "бар свободы"... так что... Я хочу изменить этот входной индикатор, не хочу использовать 4ema.... Я хочу 1ema (2 пересечения), CCI, STOCH и SAR.

Я нашел несколько мультииндикаторов, но у них не было такой истории.

кто-нибудь может помочь и изменить код?

 

Привет, Pearl1,

Из того, что я вижу, это можно сделать, вам просто нужно ввести вызов, заменив остальные 3 скользящие средние на индикаторы, которые вы хотите использовать, вместе с условиями для сигнала.

 

Я пытался что-то сделать, но безрезультатно.

 

Почему бы вам не опубликовать то, что вы закодировали на данный момент, и объяснить, что вы пытаетесь сделать. Так кто-нибудь сможет вам помочь.

pearl1:
Я пытался что-то сделать, но никакого прогресса
 

int start()

{

//----

int Counted.Bars = IndicatorCounted(), i;

if(Counted.Bars<0) return(-1);

if(Counted.Bars>0) Counted.Bars--;

int Limit = Bars - Counted.Bars;

цвет Text.Color.1, Text.Color.2, Text.Color.3, Text.Color.4;

//----

for(i=Limit; i>=0; i--)

{

MA0.Buffer.0 = iMA(NULL, 0, 1, 0, MODE_SMA, PRICE_MEDIAN, i); Я сосем здесь.... он всегда сравнивается с этим MA0.Buffer.0.... так, если я использую RSI, Stoch, ... должен создать этот буфер для всех элементов? RSI0.Buffer.0 для RSI?

//----

MA1.Buffer.0 = iMA(NULL, 0, MA1.Period, 0, MA1.Mode, MA1.Price, i);

MA1.Buffer.1 = iMA(NULL, 0, MA1.Period, 0, MA1.Mode, MA1.Price, i+1);

MA2.Buffer.0 = iMA(NULL, 0, MA2.Period, 0, MA2.Mode, MA2.Price, i);

MA2.Buffer.1 = iMA(NULL, 0, MA2.Period, 0, MA2.Mode, MA2.Price, i+1);

MA3.Buffer.0 = iMA(NULL, 0, MA3.Period, 0, MA3.Mode, MA3.Price, i);

MA3.Buffer.1 = iMA(NULL, 0, MA3.Period, 0, MA3.Mode, MA3.Price, i+1);

MA4.Buffer.0 = iMA(NULL, 0, MA4.Period, 0, MA4.Mode, MA4.Price, i);

MA4.Buffer.1 = iMA(NULL, 0, MA4.Period, 0, MA4.Mode, MA4.Price, i+1);

MA1.UP.Buffer = EMPTY_VALUE;

MA1.DN.Buffer = EMPTY_VALUE;

if(MA1.Buffer.0 < MA1.Buffer.1) MA1.DN.Buffer = Gap * P1.Position + 1.0;

else MA1.UP.Buffer = Gap * P1.Position + 1.0;

if(MA1.Buffer.0 < MA0.Buffer.0) Text.Color.1 = Text.Color.Up;

else Text.Color.1 = Text.Color.Down;

//----

MA2.UP.Buffer = EMPTY_VALUE;

MA2.DN.Buffer = EMPTY_VALUE;

if(MA2.Buffer.0 < MA2.Buffer.1) MA2.DN.Buffer = Gap * P2.Position + 1.0;

else MA2.UP.Buffer = Gap * P2.Position + 1.0;

if(MA2.Buffer.0 < MA0.Buffer.0) Text.Color.2 = Text.Color.Up;

else Text.Color.2 = Text.Color.Down;

//----

MA3.UP.Buffer = EMPTY_VALUE;

MA3.DN.Buffer = EMPTY_VALUE;

if(MA3.Buffer.0 < MA3.Buffer.1) MA3.DN.Buffer = Gap * P3.Position + 1.0;

else MA3.UP.Buffer = Gap * P3.Position + 1.0;

if(MA3.Buffer.0 < MA0.Buffer.0) Text.Color.3 = Text.Color.Up;

else Text.Color.3 = Text.Color.Down;

//----

MA4.UP.Buffer = EMPTY_VALUE;

MA4.DN.Buffer = EMPTY_VALUE;

if(MA4.Buffer.0 < MA4.Buffer.1) MA4.DN.Buffer = Gap * P4.Position + 1.0;

else MA4.UP.Buffer = Gap * P4.Position + 1.0;

if(MA4.Buffer.0 < MA0.Buffer.0) Text.Color.4 = Text.Color.Up;

else Text.Color.4 = Text.Color.Down;

//----

//----

LabelSet(Text.Color.1, Text.Color.2, Text.Color.3, Text.Color.4);

//----

}

//----

return(0);

 

Вам не нужно создавать буфер для всех элементов.

MA1.Buffer.0, MA1.Buffer.1, .... - это не буферы, а простые переменные. Вы можете использовать их для чего угодно, не меняя их имен. Если вы хотите использовать их, например, для rsi, вы можете изменить код на что-то вроде этого :

MA1.Buffer.0 = iRSI(NULL, 0, RSI1.Period, RSI1.Price, i); MA1.Buffer.1 = iRSI(NULL, 0, RSI1.Period, RSI1.Price, i+1);

без необходимости менять имена переменных, и он будет работать (просто определите RSI1.Period и RSI1.Price в этом случае как внешние параметры)

pearl1:
int start()

{

//----

int Counted.Bars = IndicatorCounted(), i;

if(Counted.Bars<0) return(-1);

if(Counted.Bars>0) Counted.Bars--;

int Limit = Bars - Counted.Bars;

цвет Text.Color.1, Text.Color.2, Text.Color.3, Text.Color.4;

//----

for(i=Limit; i>=0; i--)

{

MA0.Buffer.0 = iMA(NULL, 0, 1, 0, MODE_SMA, PRICE_MEDIAN, i); Я сосем здесь.... он всегда сравнивается с этим MA0.Buffer.0.... так, если я использую RSI, Stoch, ... должен создать этот буфер для всех элементов? RSI0.Buffer.0 для RSI?

//----

MA1.Buffer.0 = iMA(NULL, 0, MA1.Period, 0, MA1.Mode, MA1.Price, i);

MA1.Buffer.1 = iMA(NULL, 0, MA1.Period, 0, MA1.Mode, MA1.Price, i+1);

MA2.Buffer.0 = iMA(NULL, 0, MA2.Period, 0, MA2.Mode, MA2.Price, i);

MA2.Buffer.1 = iMA(NULL, 0, MA2.Period, 0, MA2.Mode, MA2.Price, i+1);

MA3.Buffer.0 = iMA(NULL, 0, MA3.Period, 0, MA3.Mode, MA3.Price, i);

MA3.Buffer.1 = iMA(NULL, 0, MA3.Period, 0, MA3.Mode, MA3.Price, i+1);

MA4.Buffer.0 = iMA(NULL, 0, MA4.Period, 0, MA4.Mode, MA4.Price, i);

MA4.Buffer.1 = iMA(NULL, 0, MA4.Period, 0, MA4.Mode, MA4.Price, i+1);

MA1.UP.Buffer = EMPTY_VALUE;

MA1.DN.Buffer = EMPTY_VALUE;

if(MA1.Buffer.0 < MA1.Buffer.1) MA1.DN.Buffer = Gap * P1.Position + 1.0;

else MA1.UP.Buffer = Gap * P1.Position + 1.0;

if(MA1.Buffer.0 < MA0.Buffer.0) Text.Color.1 = Text.Color.Up;

else Text.Color.1 = Text.Color.Down;

//----

MA2.UP.Buffer = EMPTY_VALUE;

MA2.DN.Buffer = EMPTY_VALUE;

if(MA2.Buffer.0 < MA2.Buffer.1) MA2.DN.Buffer = Gap * P2.Position + 1.0;

else MA2.UP.Buffer = Gap * P2.Position + 1.0;

if(MA2.Buffer.0 < MA0.Buffer.0) Text.Color.2 = Text.Color.Up;

else Text.Color.2 = Text.Color.Down;

//----

MA3.UP.Buffer = EMPTY_VALUE;

MA3.DN.Buffer = EMPTY_VALUE;

if(MA3.Buffer.0 < MA3.Buffer.1) MA3.DN.Buffer = Gap * P3.Position + 1.0;

else MA3.UP.Buffer = Gap * P3.Position + 1.0;

if(MA3.Buffer.0 < MA0.Buffer.0) Text.Color.3 = Text.Color.Up;

else Text.Color.3 = Text.Color.Down;

//----

MA4.UP.Buffer = EMPTY_VALUE;

MA4.DN.Buffer = EMPTY_VALUE;

if(MA4.Buffer.0 < MA4.Buffer.1) MA4.DN.Buffer = Gap * P4.Position + 1.0;

else MA4.UP.Buffer = Gap * P4.Position + 1.0;

if(MA4.Buffer.0 < MA0.Buffer.0) Text.Color.4 = Text.Color.Up;

else Text.Color.4 = Text.Color.Down;

//----

//----

LabelSet(Text.Color.1, Text.Color.2, Text.Color.3, Text.Color.4);

//----

}

//----

return(0);
 
pearl1:
int start()

{

//----

int Counted.Bars = IndicatorCounted(), i;

if(Counted.Bars<0) return(-1);

if(Counted.Bars>0) Counted.Bars--;

int Limit = Bars - Counted.Bars;

цвет Text.Color.1, Text.Color.2, Text.Color.3, Text.Color.4;

//----

for(i=Limit; i>=0; i--)

{

MA0.Buffer.0 = iMA(NULL, 0, 1, 0, MODE_SMA, PRICE_MEDIAN, i);

//----

MA1.Buffer.0 = iMA(NULL, 0, MA1.Period, 0, MA1.Mode, MA1.Price, i);

MA1.Buffer.1 = iMA(NULL, 0, MA1.Period, 0, MA1.Mode, MA1.Price, i+1);

MA2.Buffer.0 = iMA(NULL, 0, MA2.Period, 0, MA2.Mode, MA2.Price, i);

MA2.Buffer.1 = iMA(NULL, 0, MA2.Period, 0, MA2.Mode, MA2.Price, i+1);

MA3.Buffer.0 = iMA(NULL, 0, MA3.Period, 0, MA3.Mode, MA3.Price, i);

MA3.Buffer.1 = iMA(NULL, 0, MA3.Period, 0, MA3.Mode, MA3.Price, i+1);

MA4.Buffer.0 = iMA(NULL, 0, MA4.Period, 0, MA4.Mode, MA4.Price, i);

MA4.Buffer.1 = iMA(NULL, 0, MA4.Period, 0, MA4.Mode, MA4.Price, i+1);

MA1.UP.Buffer = EMPTY_VALUE;

MA1.DN.Buffer = EMPTY_VALUE;

if(MA1.Buffer.0 < MA1.Buffer.1) MA1.DN.Buffer = Gap * P1.Position + 1.0;

else MA1.UP.Buffer = Gap * P1.Position + 1.0;

if(MA1.Buffer.0 < MA0.Buffer.0) Text.Color.1 = Text.Color.Up;

else Text.Color.1 = Text.Color.Down;

//----

MA2.UP.Buffer = EMPTY_VALUE;

MA2.DN.Buffer = EMPTY_VALUE;

if(MA2.Buffer.0 < MA2.Buffer.1) MA2.DN.Buffer = Gap * P2.Position + 1.0;

else MA2.UP.Buffer = Gap * P2.Position + 1.0;

if(MA2.Buffer.0 < MA0.Buffer.0) Text.Color.2 = Text.Color.Up;

else Text.Color.2 = Text.Color.Down;

//----

MA3.UP.Buffer = EMPTY_VALUE;

MA3.DN.Buffer = EMPTY_VALUE;

if(MA3.Buffer.0 < MA3.Buffer.1) MA3.DN.Buffer = Gap * P3.Position + 1.0;

else MA3.UP.Buffer = Gap * P3.Position + 1.0;

if(MA3.Buffer.0 < MA0.Buffer.0) Text.Color.3 = Text.Color.Up;

else Text.Color.3 = Text.Color.Down;

//----

MA4.UP.Buffer = EMPTY_VALUE;

MA4.DN.Buffer = EMPTY_VALUE;

if(MA4.Buffer.0 < MA4.Buffer.1) MA4.DN.Buffer = Gap * P4.Position + 1.0;

else MA4.UP.Buffer = Gap * P4.Position + 1.0;

if(MA4.Buffer.0 < MA0.Buffer.0) Text.Color.4 = Text.Color.Up;

else Text.Color.4 = Text.Color.Down;

//----

//----

LabelSet(Text.Color.1, Text.Color.2, Text.Color.3, Text.Color.4);

//----

}

//----

return(0);

Ага, спасибо, но этот Buffers сравнивает .... все с MA0.Buffer.0 ?

 

Просто замените вызовы IMA() на нужные вам вызовы (например, iRSI() из примера, который я вам дал), и они должны работать, не нужно заменять имена переменных.

pearl1:
Ага, спасибо, но этот Buffers сравнивает .... все с MA0.Buffer.0?