Помощь в создании системы (реализация трейлинг стопа и ещё кое что)

 
Всем привет. Я новичек в mql4. Это моя первая тема, так что сразу извиняюсь, если мои вопросы будут слишком глупы.

В общем хочу создать советника на основе нескольких индикторов. Вот что уже есть:

#property copyright "Copyright © 2007, Sergey Lukyanov"

//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+

extern double lot_trade = 1;
//extern int stop = 0;
//extern int take = 100;
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
//----
int total_open=OrdersTotal();
double signal1=iCustom(NULL,0,"Ind1",0,0);
double signal2=iCustom(NULL,0,"Ind2",0,0);
double signal3=iCustom(NULL,0,"Ind3",0,0);
double signal4=iCustom(NULL,0,"Ind4",0,0);

//if (total_open == 0)
if (signal1>0)
if (signal2>0)
if (signal3>0)
if (signal4>0)
{
OrderSend(Symbol(),OP_BUY,lot_trade,Ask,3,Bid-50*Point,Ask+50*Point,"Lukyanov AutoTrader BUY",7773,0,Blue);
OrderPrint();
}

//if (total_open == 0)
if (signal1<0)
if (signal2==0)
if (signal3<0)
if (signal4<0)
{
OrderSend(Symbol(),OP_SELL,lot_trade,Ask,3,Bid+50*Point,Ask-50*Point,"Lukyanov AutoTrader SELL",7773,0,Red);
OrderPrint();
}

return(0);
}
//+------------------------------------------------------------------+
Теперь мои вопросы: как реализовать в моем советнике трейлинг стоп, т.к. из-за его отсутствия зачастую теряется прибыль?
Как сделать, чтобы советник открывал только один ордер для данной валютной пары при установке на нескольких валютах?
 
Посмотри здесь https://book.mql4.com/ru
 
Lukyanov:
Теперь мои вопросы: как реализовать в моем советнике трейлинг стоп, т.к. из-за его отсутствия зачастую теряется прибыль?
Как сделать, чтобы советник открывал только один ордер для данной валютной пары при установке на нескольких валютах?
Если стоИт цель изучить MQL4, смотри совет Vinin-а.
А если задача в написании конкретного советника, то проще/быстрее/дешевле будет заказать его у профессионала.
 
 for(int i=1; i<=OrdersTotal(); i++)          // Цикл перебора ордер
{//-1
if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий
{ //-2 // Анализ ордеров:
if (OrderSymbol()!= Symb)
{//-3
if (signal1>80)
if (signal2>0)
if (signal3>0)
if (signal4>0)
{
OrderSend(Symbol(),OP_BUY,lot_trade,Ask,3,Bid-50*Point,Ask+50*Point,"Lukyanov AutoTrader BUY",7773,0,Blue);
OrderPrint();
}

if (signal1<20)
if (signal2==0)
if (signal3<0)
if (signal4<0)
{
OrderSend(Symbol(),OP_SELL,lot_trade,Ask,3,Bid+50*Point,Ask-50*Point,"Lukyanov AutoTrader SELL",7773,0,Red);
OrderPrint();
}
}//-3
}//-2
}//-1
Спасибо за ссылки, почитал. Вопросы всё равно есть. :) Вот сделал такой код для того, чтобы советник открывал только один ордер для данной валютной пары при установке на нескольких валютах. Как проверить - не знаю, поэтому спрашиваю здесь - он правильный?
 
Lukyanov:
 Спасибо за ссылки, почитал. Вопросы всё равно есть. :) Вот сделал такой код для того, чтобы советник открывал только один ордер для данной валютной пары при установке на нескольких валютах. Как проверить - не знаю, поэтому спрашиваю здесь - он правильный? 

Проверять можно в тестере
 
Просто не знал как протестировать именно на эти условия советника. . Решил проблему написанием отдельного скриптика и проверки руками. :) Код, тот что выше - не правильный. Сделал так:
int OpenOrder = 0;

for(int io=1; io<=OrdersTotal(); io++) // Цикл перебора ордер
{//-1
if (OrderSelect(io-1,SELECT_BY_POS)==true) // Если есть следующий
{ //-2 // Анализ ордеров:
if (OrderSymbol() == Symb)
{//-3
OpenOrder = 1;
}//-3
else OpenOrder = 0;
}//-2
}//-1

if (OpenOrder == 0)
{
if (signal1>80)
if (signal2>0)
if (signal3>0)
if (signal4>0)
{
OrderSend(Symbol(),OP_BUY,lot_trade,Ask,3,Bid-50*Point,Ask+50*Point,"Lukyanov AutoTrader BUY",7773,0,Blue);
OrderPrint();
}

if (signal1<20)
if (signal2==0)
if (signal3<0)
if (signal4<0)
{
OrderSend(Symbol(),OP_SELL,lot_trade,Ask,3,Bid+50*Point,Ask-50*Point,"Lukyanov AutoTrader SELL",7773,0,Red);
OrderPrint();
}
}
 

Неправильно (про тот, что выше).

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

В представленном же коде делается другое: Вы идёте в цикле по списку ордеров с некоторым (неправильным) анализом. А именно: Вы анализируеие первый попавшийся ордер, и если он не по нашему фин.инструменту, то (в зависимости от критериев открытия) открываете ордер. Но если Вы хотите, чтоб по одному фин инструменту был всего один ордер, то на этом этапе исследований нельзя сказать есть ли по этому инстр. ордера (возможно, что они в конце списка).

Общий (корректный) порядок событий должен быть такой: сначала учесть все ордера (запомнить все критерии), потом проанализировать те критерии, кот. являются "пропускным баллом" для открытия (колич. ордеров по инстр., колич. отложенных и рыночных и т.д.) и если "ситуация именно такова, которую мы искали", то открывать ордер.

(по опыту: не тратьте время на промежуточные коды-полуфабрикаты, вместо этого один раз сделайте полноценный учёт ордеров, он Вам 100 раз ещё пригодится)

 
Что то я намудрил, в результате в журнал выдаются ошибки:

"2008.01.04 20:39:46 Lukyanov_AT EURJPY,M15: Ошибка открытия ордера: 129
2008.01.04 20:39:46 Lukyanov_AT EURJPY,M15: #18706506 2008.01.04 14:30 sell 1.00 USDCHF 1.1076 1.1076 1.1026 1.1060 0.00 0.00 144.67 Lukyanov AutoTrader SELL 0
2008.01.04 20:39:46 Lukyanov_AT CADJPY,M15: Ошибка открытия ордера: 129
2008.01.04 20:39:46 Lukyanov_AT CADJPY,M15: #18706506 2008.01.04 14:30 sell 1.00 USDCHF 1.1076 1.1076 1.1026 1.1060 0.00 0.00 144.67 Lukyanov AutoTrader SELL 0
2008.01.04 20:39:46 Lukyanov_AT GBPJPY,M15: Ошибка открытия ордера: 129
2008.01.04 20:39:46 Lukyanov_AT GBPJPY,M15: #18706506 2008.01.04 14:30 sell 1.00 USDCHF 1.1076 1.1076 1.1026 1.1060 0.00 0.00 144.67 Lukyanov AutoTrader SELL 0
"
Прикрепляю своего советника. Где ошибка в советнике?
Файлы:
 
Блин, ещё и трейлинг стоп теперь не работает. :( Помогите разобраться, пожалуйста.
 
Lukyanov:
Прикрепляю своего советника. Где ошибка в советнике?

     OrderSend(Symbol(),OP_BUY,lot_trade,Ask,3,Bid-50*Point,Ask+50*Point,"Lukyanov AutoTrader BUY",0,0,Blue);
       ...
     OrderSend(Symbol(),OP_SELL,lot_trade,Ask,3,Bid+50*Point,Ask-50*Point,"Lukyanov AutoTrader SELL",0,0,Red);

.. а надо Ask, Bid, Bid и Bid, Ask, Ask. Посмотрите Характеристики ордеров и правила проведения торговых операций в Учебнике.

Причина обращения: