Как кодировать? - страница 187

 

Да, я хочу сделать 3 шага

Пример:

Дойти до 15 и вернуться на 10

Достичь 30 и вернуться 15

Достичь 45 и вернуться на 15

Или закрыться по стоп-лоссу.

Я сделаю фотографию и постараюсь объяснить лучше.

 
fosgate_r:
Это что-то новое для меня.

Значит, при закрытии убыточной сделки всегда нужно ждать отскока, так?

А если отскока не будет?

Мы закроемся на начальном SL?

Спасибо, я уже сделал это, теперь пытаюсь оптимизировать, чтобы получить хорошие результаты с этой защитой от потерь.

 

Я пытаюсь найти информацию о построении линии, как в индикаторе RSI, например. У меня есть два числа, которые я хочу построить как линии на одном индикаторе.

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

 

индикаторный буфер

SPACECHIMP:
Я пытаюсь найти информацию о построении линии, как в индикаторе RSI, например. У меня есть два числа, которые я хочу построить как линии на одном индикаторе. Я знаю, что для этого нужно использовать какой-то массив, но мне не удается понять, какая группа кода позволит это сделать.

Пожалуйста, прочитайте эту статью

Язык MQL4 для новичков. Пользовательские индикаторы (часть 1) - Статьи по MQL4

 
smb1970:
Привет, народ,

Я не знаю, знаком ли кто-нибудь с Forex Made-EZ Джорджа Смита.

В настоящее время я изучаю его работы и задался вопросом, не кодировал ли кто-нибудь индикатор для осциллятора Oscar, который он использует?

Формула такова

пусть A = самый высокий максимум за последние восемь баров (включая этот)

пусть B = самый низкий минимум за последние восемь баров (включая этот)

пусть C = цена закрытия текущего бара

пусть X = предыдущая фигура осциллятора (Оскар).

Сегодняшний "грубый" осциллятор равен (C-B), разделенному на (A-B), умноженному на 100.

Далее мы "сглаживаем" наше грубое число (назовем его Y) следующим образом:

Окончательное число осциллятора = ((X разделить на 3) умножить на 2), плюс (Y разделить на 3).

Если кто-либо кодировал или может кодировать это, буду очень признателен.

С уважением, Стив

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

#property indicator_separate_window

#property indicator_buffers 1

#property indicator_color1 Red

//---- буферы

double ExtMapBuffer1[];

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

//| Пользовательская функция инициализации индикатора |

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

int init()

{

//---- индикаторы

SetIndexStyle(0,DRAW_LINE);

SetIndexBuffer(0,ExtMapBuffer1);

string short_name = "Oscar Indicator";

IndicatorShortName(short_name);

//----

return(1);

}

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

//| Функция деинициализации индикатора Custor |

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

int deinit()

{

return(0);

}

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

//| Пользовательская функция итерации индикатора |

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

int start()

{

int counted_bars=IndicatorCounted();

//---- проверка на возможные ошибки

if (counted_bars<0) return(-1);

//---- последний подсчитанный бар будет пересчитан.

if (counted_bars>0) counted_bars--;

int pos=Bars-counted_bars;

//---- основной цикл вычислений

double x;

x=50;

while(pos>=0)

{

double a, b, c, y, osc;

//let A = самый высокий максимум последних восьми баров (включая этот)

a=High;

//let B = самый низкий минимум за последние восемь баров (включая этот)

b=Low;

//let C = цена закрытия текущего бара

c = Close[pos];

//let X = предыдущая фигура осциллятора (Oscar)

//Сегодняшний "грубый" осциллятор равен (C-B) деленному на (A-B) умноженному на 100.

y=((c-b)/(a-b))*100;

//Следует "сгладить" наше грубое число (назовем его Y) следующим образом:

//Окончательное число осциллятора = ((X разделить на 3) умножить на 2), плюс (Y разделить на 3).

osc=((x/3)*2)+(y/3);

ExtMapBuffer1[pos]= osc ;

pos--;

}

return(0);

}

Любая помощь будет принята с благодарностью.

Спасибо, Стив

 

Спросите... Режим_торговли

Здравствуйте, может ли кто-нибудь привести пример использования MODE_TRADES?

Спасибо.

 

To smb1970 - вот оно:

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

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

#property indicator_separate_window

#property indicator_buffers 1

#property indicator_color1 Red

#property indicator_maximum 100

#property indicator_minimum 0

//

//

//

//

//

extern int OscPeriod = 8;

extern int OscPrice = PRICE_CLOSE;

double oscBuffer[];

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

//| |

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

//

//

//

//

//

int init()

{

SetIndexBuffer(0,oscBuffer);

IndicatorShortName("Osc ("+OscPeriod+")");

return(0);

}

int deinit() { return(0); }

int start()

{

int counted_bars=IndicatorCounted();

int i,limit;

if(counted_bars<0) return(-1);

if(counted_bars>0) counted_bars--;

limit=Bars-counted_bars;

//

//

//

//

//

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

{

double price = iMA(NULL,0,1,0,MODE_SMA,OscPrice,i);

double high = High[ArrayMaximum(High,OscPeriod,i)];

double low = Low[ArrayMinimum(Low,OscPeriod,i)];

//

//

//

//

//

if (high!=low)

double raw = 100.00*(price-low)/(high-low);

else raw = 0.00;

oscBuffer= oscBuffer*2.0/3.0 + raw/3.0;

}

return(0);

}

Но посмотрите на картинку: вверху - "Оскар", внизу - Ema(5) стохастика(8), или, если еще проще, внизу - Stochastic(8,5,1) с сигнальной линией, установленной на экспоненциальную. Таким образом, "Оскар" - это просто сигнальная линия стохастика.

Файлы:
oscar.gif  21 kb
 

Спасибо!

Спасибо mladen, это не только очень полезно, но и очень показательно!

 

NewB нужна помощь в кодировании :-(

Привет всем,

Мне нужна разрозненная помощь здесь . У меня есть некоторый код, который будет искать согласие между различными индикаторами. Как только они все согласны, я хочу, чтобы сделки входили так, как я описал это в изображениях графиков. Пока что я могу ввести 1 сделку "Buy", но она не вводит только 1 сделку...., а вводит до 8 сделок. И затем, если рынок идет против меня, я вхожу в "непредвиденную сделку", где я снова покупаю/продаю, несмотря на то, что рынок идет против меня. Я буду очень признателен, если кто-нибудь покажет мне, как должен выглядеть правильный код.

Не уверен, что эти изображения отобразятся, но на всякий случай я приложил их в качестве вложений.

Вот мой неполноценный код, который должен выполнить сделку...

while (execute_trade ==5)

{if (OrdersTotal() == buy_trade1 ) //buy_trade1 = 1... это останавливает его после того, как 1 ордер был размещен... но пока не работает

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point);

execute_trade=0;

if(OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES))

Print("My ticket is: " , ticket);

{

buy1 = OrderOpenPrice(); //берем цену 1-го ордера и заталкиваем ее в эту переменную

// Комментарий(" цена открытия ордера №1 составляет ", OrderOpenPrice() + " " + buy1 + " меньше чем " + (buy1-0.0030));

if (buy1 >= (buy1-0.0030))

{

//if ( OrdersTotal() <= buy_trade1 ) //это останавливает его после размещения 1 ордера.

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point);

//execute_trade=0;

}

} else

Print("OrderSelect вернул ошибку ",GetLastError());

}

 

NewB нуждается в помощи в кодировании

Привет всем,

Мне нужна разрозненная помощь. У меня есть код, который будет искать согласие между различными индикаторами. Как только они все согласятся, я хочу, чтобы сделки входили так, как я описал это в изображениях графиков. Пока что я могу ввести 1-ю сделку "Buy", но она не вводит только 1 сделку...., а вводит до 8 сделок. И затем, если рынок идет против меня, я вхожу в "непредвиденную сделку", где я снова покупаю/продаю, несмотря на то, что рынок идет против меня.Я буду очень признателен, если кто-нибудь покажет мне, как должен выглядеть правильный код.

Не уверен, что эти изображения будут показаны, но на всякий случай я прикрепляю их в качестве вложений.

Рис. 1

Рис. 2

Вот мой неполноценный код, который должен выполнить сделку...

while (execute_trade ==5)

{if (OrdersTotal() == buy_trade1 ) //buy_trade1 = 1... это останавливает его после того, как 1 ордер был размещен... но пока не работает

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+ TakeProfit*Point);

execute_trade=0;

if(OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES))

Print("My ticket is: " , ticket);

{

buy1 = OrderOpenPrice(); //берем цену 1-го ордера и заталкиваем ее в эту переменную

// Комментарий(" цена открытия ордера №1 составляет ", OrderOpenPrice() + " " + buy1 + " меньше чем " + (buy1-0.0030));

if (buy1 >= (buy1-0.0030))

{

//if ( OrdersTotal() <= buy_trade1 ) //это останавливает его после размещения 1 ордера.

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+ TakeProfit*Point);

//execute_trade=0;

}

}

else

Print("OrderSelect вернул ошибку ",GetLastError());

}