Пробой средней.Помогите оформить задачу. - страница 2

 
DmitriyN:
Я понял. Возьмём одну пару EURUSD, например. У вас положительные результаты работы вашей ТС по этой паре есть? Можно на стейт взглянуть, если есть?

Извините,прикрепить файл неполучилось почему-то.

http://depositfiles.com/files/r5hsiekll

депозит 250 . Объем 0.01

http://depositfiles.com/files/i14nlcv8z

депозит 1500 объем 0.1


Для первого раза думаю сгодиться)
Параметры ещё не не оптимизированы, можно ещё добавить функцию увеличение объема пропорционально свободным средствам, тогда результат примерно удваивается . Пока ничего другого скозать не могу надо оптимизировать, опробовать на демо тп.

А кстати код я неполный выложил, там ещё условия ТС есть, если надо выложу.

 

SergNF спасибо большое, да так и вечером сделаю.

Ток вот непонятно че там в моем коде не так было.

Номер магика можно использовать как индентификатор, по которому бот находит свои ордера, верно ?

 
Skyisover:

Здравствуйте. Недавно начал учить MQL4. Вот пишу первый эксперт. На истории все проходит гладко, а на демо возникают проблемы.

Задача: При пробивании свечой IMA на дневном графике(или на любом) во время формирования нового бара(нулевого) открывать ордер в направлении пробива, на максимальной(БайСтоп) и минимальной(Селстоп) цене прошлого бара(который пробил IMA). Если есть открытый данным экспертом ордер на данном графике ( на данной паре ) игнорировать, все последующие сигналы сигналы.

Проблема. На демо открывает один ордер на все графики( те на одну валютную пару, должен открывать по 1 ордеру на каждую пару (каждое окно)). Вроде я все учел в коде, но все равно где то что-то не пошло как надо.

Помогите, пожалуйста, буду признателен.

Ваш код.

extern int periodma=3;

extern double vol=0.01;

extern int expiration=0;

extern int mashift=0;

extern int shift=1;

int magic=77777; 

 int start()

{ double ma=iMA(Symbol(),0,periodma,mashift,MODE_SMA,PRICE_CLOSE,shift);

   double tp=High[1];

   double sl=Low[1];

   bool cond=false;

   if(OrdersTotal()==0) 

     {cond=true;}   

   else for(int i=1; i<=OrdersTotal(); i++)

           {  

            if(OrderSelect(i-1,SELECT_BY_POS)==true)

               {if (OrderSymbol()!=Symbol())

                   {continue;}                   

                if(OrderMagicNumber()!=magic)         

                  {

                   cond=true;

                   continue;                             

                  }                 

                else break;                     

               }

           }  

   RefreshRates();   

   if(cond==true)

     {if(Open[1]>ma&&Close[1]<ma)

      {OrderSend(Symbol(),OP_SELLSTOP,vol,Low[1],2,High[1],0,NULL,magic,0,Red);}

      if(Open[1]<ma&&Close[1]>ma)

      {OrderSend(Symbol(),OP_BUYSTOP,vol,High[1],2,Low[1],0,NULL,magic,0,Blue);}

     }   

} 

} 


1. вешаем поочередно на графики


2. if(OrdersTotal()==0) - сначала всегда истинно - нет открытых ордеров


3. сработало


if(OrdersTotal()==0)

{cond=true;}

4. Открыли ордер по первой паре. Остальные в ожидании - ордера открываются последовательно даже по разным парам - поток один.


5. Дальше if(OrdersTotal()==0) - всегда ложно - есть открытые ордера

6. попадаем на else for(int i=1; i<=OrdersTotal(); i++)

а вот теперь мы все время будем выпадать из цикла либо по условию

if (OrderSymbol()!=Symbol())

{continue;}

Поскольку по какой-то паре ордер выставлен или по

if(OrderMagicNumber()!=magic) // это всегда здесь ложно

{

cond=true;

continue;

}

else break;

поскольку выставлен ордер с соответствующим магиком.

Так что - все работает как написано ;). Возможно не так, как Вы предполагали ...... как думаете поправить ?

ЗЫ К условиям открытия еще вернемся, если захотите разобраться - пока не них не концентрируйтесь.

 
DmitriyN:
Каковы у вас результаты работы хотя бы на одной паре?

? прикольная помощь ... он же написал, что учится программировать

Здравствуйте. Недавно начал учить MQL4. Вот пишу первый эксперт. На истории все проходит гладко, а на демо возникают проблемы.

не написал, а пишу ;) ..... какие результаты работы ?

 
SergNF:

Мдааа. Куда скатился форум. (Вот они "скучающие ... кхм ... форумчане"). Хотя все согласно анекдоту про англоязычный, ивритоязычный и русскоязычные форумы. :(

2Топикастер.

"Проанализируйте" и вставьте в свой советник (в свои советники), например, такую функцию.

(int magic=77777 лучше сделать "extern")

И подобных функций, написанных один раз и "навсегда" (в кавычках) много.
Return внутри цикла for возвращает true и заканчивает интерацию, верно ?
 
VladislavVG:

Ваш код.


6. попадаем на else for(int i=1; i<=OrdersTotal(); i++)

а вот теперь мы все время будем выпадать из цикла либо по условию

if (OrderSymbol()!=Symbol())

{continue;}

Поскольку по какой-то паре ордер выставлен или по

if(OrderMagicNumber()!=magic) // это всегда здесь ложно

{

cond=true;

continue;

}

else break;

поскольку выставлен ордер с соответствующим магиком.

Так что - все работает как написано ;). Возможно не так, как Вы предполагали ...... как думаете поправить ?

ЗЫ К условиям открытия еще вернемся, если захотите разобраться - пока не них не концентрируйтесь.

Не очень хорошо понял Вас, но в коде я подразумевал следующее:

if (OrderSymbol()!=Symbol()){continue;} если символ ордера не такой же, что и символ валютной пары окна графика к которому присоединен советник т.е символ не наш -продолжить цикл выбора

if(OrderMagicNumber()!=magic) если магик ордера не равен магику советника т.е ордеров открытых данным советником нет, cond=true; условия истины и можно открывать ордер continue - продолжить интерацию до исчерпания ;

else break; если попадается ордер с нашим магиком прекратить цикл, и поскольку cond=false по умолчанию ордер нельзя открывать.

Где моя логика не совпадает с кодом ?Объясните, пожалуйста.

 
Skyisover:

Не очень хорошо понял Вас, но в коде я подразумевал следующее:

if (OrderSymbol()!=Symbol()){continue;} если символ ордера не такой же, что и символ валютной пары окна графика к которому присоединен советник т.е символ не наш -продолжить цикл выбора

if(OrderMagicNumber()!=magic) если магик ордера не равен магику советника т.е ордеров открытых данным советником нет, cond=true; условия истины и можно открывать ордер continue - продолжить интерацию до исчерпания ;

else break; если попадается ордер с нашим магиком прекратить цикл, и поскольку cond=false по умолчанию ордер нельзя открывать.

Где моя логика не совпадает с кодом ?Объясните, пожалуйста.

Подумайте немного - Ваша логика совсем рядом.. в выделенном ошибка: вы выставляете по всем инструментам ордера с одинаковым магиком ;) ..... я то могу пояснить, но самостоятельно добраться гораздо ценнее. Подсказка: Ваш код будет работать, если проверять ордера по инструменту, а не все оптом.
 
VladislavVG:
Подумайте немного - Ваша логика совсем рядом.. в выделенном ошибка: вы выставляете по всем инструментам ордера с одинаковым магиком ;) ..... я то могу пояснить, но самостоятельно добраться гораздо ценнее. Подсказка: Ваш код будет работать, если проверять ордера по инструменту, а не все оптом.

Сделал магиг внешней величиной, отдельной для каждого инструмента. Посмотрим что будет.
 
Skyisover:

Сделал магиг внешней величиной, отдельной для каждого инструмента. Посмотрим что будет.


Ваши два if'а не отрабатывают как логическое И. В итоге после первого if'а остается предыдущее значение переменной cond (true). В конце концов, Вы хотите торговать на Символе и по Магику, поэтому уйдите от "!=" и объедините эти два условия. (Если конечно стиль Fortran 4 Вам не ближе ;) )

ЗЫ. Кстати оказывается ветка не далеко убежала. Там (в начале) кроме функций описаны и их вызовы. Сами функции описаны доступно и если их код читать "по-русски" то все будет понятно. (Минус - там все про четырехзнак, как минимум)

 
SergNF:


Ваши два if'а не отрабатывают как логическое И. В итоге после первого if'а остается предыдущее значение переменной cond (true). В конце концов, Вы хотите торговать на Символе и по Магику, поэтому уйдите от "!=" и объедините эти два условия. (Если конечно стиль Fortran 4 Вам не ближе ;) )

ЗЫ. Кстати оказывается ветка не далеко убежала. Там (в начале) кроме функций описаны и их вызовы. Сами функции описаны доступно и если их код читать "по-русски" то все будет понятно. (Минус - там все про четырехзнак, как минимум)

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