Разработка советника для конкурса с нуля
Страница 1 из 2 1 2 ПоследняяПоследняя
Показано с 1 по 10 из 15

Тема: Разработка советника для конкурса с нуля

  1. #1
    Новичок Аватар для SilverKZ
    Регистрация
    19.11.2012
    Сообщений
    204
    Promo (¢)
    3,898
    Благодарности
    Получено: 138
    Отправлено: 13

    Cool Разработка советника для конкурса с нуля

    Конкурс "CopyFX: провайдеры сигналов" – правила.
    Выделил два самых важных условия для советника:
    – обязательное использование стоп-лоссов
    – соблюдение лимита потерь на неделю - 500$

    Пилотное название советника – Android FX

    Вы не можете благодарить!

  2. #2
    Теоретик Аватар для Andrey554
    Регистрация
    22.03.2013
    Сообщений
    2,392
    Promo (¢)
    20
    Благодарности
    Получено: 44
    Отправлено: 35
    Добрый вечер,вы наверное не знаете что в данном конкурсе использовать советников нельзя...и там кстати трудновато вести торговлю,нужно описывать все свои сделки,делать отчеты и т.д.интересно как вы собираетесь с помощью своего советника соблюдать все правила конкурса.

    Вы не можете благодарить!

  3. #3
    Новичок Аватар для SilverKZ
    Регистрация
    19.11.2012
    Сообщений
    204
    Promo (¢)
    3,898
    Благодарности
    Получено: 138
    Отправлено: 13
    Цитата Сообщение от Andrey554 Посмотреть сообщение
    Добрый вечер,вы наверное не знаете что в данном конкурсе использовать советников нельзя
    Приветствую вас, в правилах запрета нет, в теме Участие советников в конкурсе запрета также не увидел. В этой же ветке модератор пишет
    ...Есть правила конкурса, появились участники, которые хотят использовать советники. Это не запрещено, но у меня возникли вопросы к желающим. В итоге я сам должен на них и отвечать.
    Вот у тебя есть советник, не демагогию разводи, а переходи к практике.
    Пишешь огромное сообщение такого содержания: мой любимый советник совершает не более 1 сделки в день, устанавливает такие-то стопы и профиты, имеет настройки таких-то параметров, основан на такой-то торговой стратегии. Считаю, что под параметры конкурса он подходит. Советник написан не мной, но по моему заданию и т.д. А так разговор ни о чём.
    Может пропустил, дайте ссылку где запрещается

    Цитата Сообщение от Andrey554 Посмотреть сообщение
    ...и там кстати трудновато вести торговлю,нужно описывать все свои сделки,делать отчеты и т.д.интересно как вы собираетесь с помощью своего советника соблюдать все правила конкурса.
    Например
    1) Уведомление с отчетом на почту - функция SendMail()
    2) Сохранение изображения текущего графика - WindowScreenShot()
    3) Отсылка файла по адресу - SendFTP()
    далее в ручную публикация на форуме

    Вы не можете благодарить!

  4. #4
    Новичок Аватар для SilverKZ
    Регистрация
    19.11.2012
    Сообщений
    204
    Promo (¢)
    3,898
    Благодарности
    Получено: 138
    Отправлено: 13
    Цитата Сообщение от Andrey554 Посмотреть сообщение
    А почему вы сами не пробуете торговать данным советником на этом конкурсе.Если же вы все учли то тогда я вам желаю удачи в создании такого советника,с которым действительно можно выиграть этот конкурс.
    Советника нет. Приглашаю желающих принять участие в разработке.

    И первое, с чего хотелось бы начать, это определение правил на вход и выход из сделки (или торговых критерий)

    1) Торговые критерии (условия для входа и выхода)
    Пойду эмпирическим путем, смотрю на график и делаю выводы. Для начала на «голом» графике отмечаю идеальные точки входа, при этом учитываю следующие моменты:
    - движение цен подчинено тенденциям, т.е. точка входа должна быть в направлении тренда
    - любое движение зигзагообразное и состоит в тренде из импульса и коррекции, где импульс больше коррекции. Логично будет входить на коррекции и брать импульс.
    7777.jpg
    Займусь проверкой сигналов различных индикаторов на соответствие идеальным точкам входа. О результатах сообщу.

    Вы не можете благодарить!

  5. #5
    Новичок Аватар для SilverKZ
    Регистрация
    19.11.2012
    Сообщений
    204
    Promo (¢)
    3,898
    Благодарности
    Получено: 138
    Отправлено: 13
    За основу беру самую простую схему торговли на откатах по тренду. Если кто-то предложить более эффективную методу, то рассмотрю варианты.

    Итак, тенденция определяется по направлению скользящей средней линии (iМА) по следующему правилу:
    1) Если iМА[1] > iМА[2], то тенденция вверх
    2) Если iМА[1] < iМА[2], то тенденция вниз
    3) Если iМА[1] = iМА[2], то тенденции нет

    00001.jpg

    Окончание коррекции (разворот цены) определяется по индикатору MACD

    00002.jpg

    В MACD в качестве фильтра используются уровни (Level). Сигнал на разворот принимается, если гистограмма выше/ниже определенных уровней.

    00003.jpg

    Вы не можете благодарить!

  6. #6
    Новичок Аватар для SilverKZ
    Регистрация
    19.11.2012
    Сообщений
    204
    Promo (¢)
    3,898
    Благодарности
    Получено: 138
    Отправлено: 13
    Сделал отдельно индикатор-стрелочник для визуализации сигналов.
    Основная МА – линия баланса цены, она же выступает поддержкой/сопротивлением
    Пунктирные линии показывают условно «перекупленность/перепроданность» инструмента



    Функция в советник

    Скрытый текст

    PHP код:
    //+------------------------------------------------------------------+
    //| Android FX.mq4                                                   |
    //| Copyright © 2013, SilverKZ                                       |
    //| silverkz@@mail.kz                                                |
    //+------------------------------------------------------------------+
    //| Функция вычисления торговых критериев.                           |
    //| Возвращаемые значения:                                           |
    //| 10 - сигнал по покупку (Buy)                                     |
    //| 20 - сигнал на продажу (Sell)                                    |
    //| 0  - сигналов нет                                                |
    //+------------------------------------------------------------------+
    int Signal(string Symb,
               
    int fMA_Trend,
               
    int fМА_Fast,
               
    int fМА_Slow,
               
    int fMA_Method,
               
    int fMA_Price,
               
    double fLevel)               // Пользовательская функция
      
    {
    //--------------------------------------------------------------------
       // Получение значений индикаторов:
       
    double MA_1   iMA(Symb,0,fMA_Trend,0,fMA_Method,fMA_Price,1); // 1 бар
       
    double MA_2   iMA(Symb,0,fMA_Trend,0,fMA_Method,fMA_Price,2); // 2 бар 
       
    double MACD_1 iMA(Symb,0,fМА_Fast,0,fMA_Method,fMA_Price,1)-
                       
    iMA(Symb,0,fМА_Slow,0,fMA_Method,fMA_Price,1); 
       
    double MACD_2 iMA(Symb,0,fМА_Fast,0,fMA_Method,fMA_Price,2)-
                       
    iMA(Symb,0,fМА_Slow,0,fMA_Method,fMA_Price,2); 
       
    double MACD_3 iMA(Symb,0,fМА_Fast,0,fMA_Method,fMA_Price,3)-
                       
    iMA(Symb,0,fМА_Slow,0,fMA_Method,fMA_Price,3); 
    //--------------------------------------------------------------------
       // Вычисление торговых критериев
       
    if (MA_1>=MA_2 && MACD_1>MACD_2 && MACD_3>=MACD_2 && MACD_2<-fLevel)
           return(
    10);                      // сигнал по покупку (Buy) 
       
    if (MA_1<=MA_2 && MACD_1<MACD_2 && MACD_3<=MACD_2 && MACD_2>fLevel)
           return(
    20);                      // сигнал на продажу (Sell)
    //--------------------------------------------------------------------
       
    return(0);                           // Выход из пользов. функции
      
    }
    //-------------------------------------------------------------------- 
    [свернуть]

    Вы не можете благодарить!

  7. #7
    Новичок Аватар для SilverKZ
    Регистрация
    19.11.2012
    Сообщений
    204
    Promo (¢)
    3,898
    Благодарности
    Получено: 138
    Отправлено: 13
    Реализована функция открытия ордеров по сигналу с установкой тейк-профита и стоп-лосса. Предусмотрена незатейливая обработка ошибок.

    00006.jpg

    PHP код:
    //+------------------------------------------------------------------+
    //| Android FX.mq4                                                   |
    //| Copyright © 2013, SilverKZ                                       |
    //| silverkz@@mail.kz                                                |
    //+------------------------------------------------------------------+
    //| Функция открытия ордеров                                         |
    //| Возвращаемые значения:                                           |
    //| true  - успешное открытие ордера                                 |
    //| false - ошибка открытия ордера                                   |
    //| Внешние параметры: Magic, slippage                               |
    //+------------------------------------------------------------------+
    bool OPENORDER(string vSymb,
                   
    string vOrd,
                   
    double vLot,
                   
    double vPrice,
                   
    double vStopLoss,
                   
    double vTakeProfit)
      {
    //--------------------------------------------------------------------  
       
    int error,err;
       
    double TP,SL;
       
    double spread,ask,bid;
       
    double point  MarketInfo(vSymb,MODE_POINT);
       
    int    digits MarketInfo(vSymb,MODE_DIGITS); 
    //----+ 
       
    while (true)
       {  
          
    error=true;
          
    spread MarketInfo(vSymb,MODE_SPREAD);
          
    ask    MarketInfo(vSymb,MODE_ASK);
          
    bid    MarketInfo(vSymb,MODE_BID);
       
    //----+           
          
    if (vOrd=="Buy")
          {
             if (
    vTakeProfit==0TP=0; else TP=NormalizeDouble(ask+vTakeProfit*point,digits); 
             if (
    vStopLoss==0SL=0; else SL=NormalizeDouble(ask-vStopLoss*point,digits); 
          }
          if (
    vOrd=="Sell")
          {
             if (
    vTakeProfit==0TP=0; else TP=NormalizeDouble(bid-(vTakeProfit-spread)*point,digits); 
             if (
    vStopLoss==0SL=0; else SL=NormalizeDouble(bid+vStopLoss*point,digits); 
          }      
       
    //----+    
          
    if (vOrd=="Buy")  error=OrderSend(vSymb,OP_BUYvLot,NormalizeDouble(ask,digits),slippage,SL,TP,"",Magic,0,Blue);
          if (
    vOrd=="Sell"error=OrderSend(vSymb,OP_SELL,vLot,NormalizeDouble(bid,digits),slippage,SL,TP,"",Magic,0,Red);
       
    //----+  
          
    if (error==-1)
          {  
             Print(
    "Error  " ,GetLastError()," ",vSymb);
             
    err++;
             
    Sleep(2000);
             
    RefreshRates();
          }
          if (
    err >10) return(false);
          if (
    error!=-1) return(true);
       }
    //----+  
    return(true);

    //-------------------------------------------------------------------- 

    Простой трейлинг-стоп, устранил ошибку OrderModify ERROR 1

    00007.jpg

    PHP код:
    //+------------------------------------------------------------------+
    //| Android FX.mq4                                                   |
    //| Copyright © 2013, SilverKZ                                       |
    //| silverkz@@mail.kz                                                |
    //+------------------------------------------------------------------+
    //| Функция модификации ордеров                                      |
    //+------------------------------------------------------------------+
    void TrailingStop(string tSymbint tTrailingStop)

    //----+ 
       
    for(int cnt=0;cnt<OrdersTotal();cnt++)
       {
          
    OrderSelect(cntSELECT_BY_POSMODE_TRADES);
          if(
    OrderType()<=OP_SELL && OrderSymbol()==tSymb && OrderMagicNumber()==Magic
          {
             
    double tPoint  MarketInfo(tSymb,MODE_POINT);
             
    int    tDigits MarketInfo(tSymb,MODE_DIGITS); 
             
    double tAsk    MarketInfo(tSymb,MODE_ASK);
             
    double tBid    MarketInfo(tSymb,MODE_BID);
          
    //----+ 
             
    if(OrderType()==OP_BUY)  
             {
                if(
    tBid-OrderOpenPrice() > tTrailingStop*tPoint)
                {
                   if(
    NormalizeDouble(tBid-tTrailingStop*tPoint OrderStopLoss(),tDigits) > 0)
                   {
                      
    OrderModify(OrderTicket(),OrderOpenPrice(),tBid-tTrailingStop*tPoint,OrderTakeProfit(),0,Green);
                      return;
                   }
                }
             }
             else
             {
                if(
    OrderOpenPrice()-tAsk tTrailingStop*tPoint)
                {
                   if((
    NormalizeDouble(OrderStopLoss() - tAsk-tTrailingStop*tPoint,tDigits) > 0) || OrderStopLoss()==0)
                   {
                      
    OrderModify(OrderTicket(),OrderOpenPrice(),tAsk+tTrailingStop*tPoint,OrderTakeProfit(),0,Red);
                      return;
                   }
                }
             }
          
    //----+ 
          
    }
       }
    //----+    
       
    return;
    }
    //------------------------------------------------------------------- 

    Вы не можете благодарить!
    Последний раз редактировалось SilverKZ; 05.04.2013 в 16:51.

  8. #8
    Новичок Аватар для SilverKZ
    Регистрация
    19.11.2012
    Сообщений
    204
    Promo (¢)
    3,898
    Благодарности
    Получено: 138
    Отправлено: 13
    Медленно, но все же продвигаюсь к цели )
    Реализовал функцию отправки уведомления на электронную почту

    PHP код:
    //+------------------------------------------------------------------+
    //| Android FX.mq4                                                   |
    //| Copyright © 2013, SilverKZ                                       |
    //| silverkz@@mail.kz                                                |
    //+------------------------------------------------------------------+
    //| Функция отправки уведомления на электронную почту                |
    //| index - номер (тикет) ордера                                     |
    //+------------------------------------------------------------------+
    void SendMailSignal(int index)       

    //----+ 
      
    if(OrderSelect(indexSELECT_BY_TICKET)==true)
         
    SendMail("OPEN TRADE"," "+OrderSymbol()+
                  
    " Ticket: "+index+
                  
    " OpenTime: "+TimeToStr(OrderOpenTime())+
                  
    " OrderType: "+int_to_type(OrderType())+
                  
    " Order Lots: "+DoubleToStr(OrderLots(),2)+
                  
    " OpenPrice: "+DoubleToStr(OrderOpenPrice(),5)+
                  
    " StopLoss: "+DoubleToStr(OrderStopLoss(),5)+
                  
    " TakeProfit: "+DoubleToStr(OrderTakeProfit(),5));
      else
         
    SendMail("ERROR OPEN TRADE"," "+"OrderSelect() вернул ошибку - "+GetLastError());
    //----+    
       
    return;
    }
    //--------------------------------------------------------------------
    string int_to_type(int type) {
      switch(
    type) {
        case 
    0: return("BUY");
        case 
    1: return("SELL");
        case 
    2: return("BUY LIMIT");
        case 
    3: return("SELL LIMIT");
        case 
    4: return("BUY STOP");
        case 
    5: return("SELL STOP");
      }
    }
    //-------------------------------------------------------------------- 
    Также, необходимо настроить МТ для отправки писем в меню - Сервис/Настройки/Почта
    На _mail.ru я настроил так

    0009.gif

    В результате работы функции на ящик в 09:33 пришло сообщение

    OPEN TRADE
    EURUSD Ticket: 787368751 OpenTime: 2013.04.08 09:33 OrderType: BUY Order Lots: 0.20 OpenPrice: 1.2983 StopLoss: 1.2953 TakeProfit: 1.3043
    Дополнительно на _mail.ru настроил бесплатное уведомление на мобильный телефон о входящих письмах, в результате в 09:33 на телефон пришло СМС следующего содержания:
    Новое письмо от «Expert Advisor» silverkaz@mail. ru, тема «OPEN TRADE»
    В течение двух часов открылось еще 3 ордера, уведомления пришли своевременно, все работает, как задумано.

    Вы не можете благодарить!

  9. #9
    Новичок Аватар для SilverKZ
    Регистрация
    19.11.2012
    Сообщений
    204
    Promo (¢)
    3,898
    Благодарности
    Получено: 138
    Отправлено: 13
    В принципе советник уже находится в рабочем состоянии, в настоящее время установлен на VPS для тестирования на ошибки открытия/закрытия ордеров, осталось только сделать блок управления капиталом и оптимизировать параметры.
    Как и задумывалось, советник мультивалютный, одновременно работает с 7 основными парами:
    EURUSD
    GBPUSD
    AUDUSD
    NZDUSD
    USDCHF
    USDCAD
    USDJPY

    Функция управления капиталом должна соответствовать правилам конкурса

    2. Лимит потерь за неделю - 500$
    Что не должно превышать лимит потерь:
    - риск в сделке, с учётом зафиксированного убытка с начала недели;
    - совокупный риск по открытым сделкам, с учётом зафиксированного убытка с начала недели;
    - сумма зафиксированных убытков за неделю.
    Понимаю так:

    1) Sum_Loss – сумма убытков по всем ордерам с начала недели
    2) Sum_Orders – совокупный риск по всем открытым ордерам
    3) Risk_Order – риск в открываемой сделке
    4) Risk_Orders = Risk_Order + Sum_Orders + Sum_Loss

    Далее, если Risk_Orders >= 500, то рассчитываемая сделка не открывается (либо пересчитать лот, чтобы совокупный риск не превышал 500) и до следующего понедельника торги запрещены.

    Вы не можете благодарить!
    Последний раз редактировалось SilverKZ; 08.04.2013 в 17:04.

  10. #10
    Теоретик Аватар для Adver117
    Регистрация
    13.02.2012
    Адрес
    Риддер, Казахстан
    Сообщений
    697
    Promo (¢)
    0
    Благодарности
    Получено: 213
    Отправлено: 70
    SilverKZ, интересно понаблюдать за созданием бота для CopyFX. Сам начинал, да на работе завал случился, некогда было даже к компу подойти. Можно было бы даже совместно поучаствовать , но смотрю у тебя уже почти готов сов.

    Интересно будет взглянуть на блок расчета ММ.

    Вот мой вариант, конечно не лишен недостатков, но все же может пригодиться.
    PHP код:
    [CODE]
    /* ------------------------------Рассчет лота ------------------------------------*/
    double Get_Lots(int SL
    {
       
    double lot,loss_Sum;
       
    loss_Sum=GetLossSumm()+GetRiskSumm();
       if (
    loss_Sum+RiskSumm<MaxRiskSummlot=RiskSumm/(SL*TickValue); 
       else return(
    0);         
       return(
    LotNormalize(lot));
    }

    //------
    double LotNormalize(double x
    {                                     
       
    x=MathFloor(x*100)/100;
       if (
    MaxLotMaxLot;
       if (
    MinLotMinLot;
       return(
    x);
    }

    //------
    double GetLossSumm() // Сумма риска по закрытым позициям с начала недели
    {
     
    datetime DateLast;
     
    double summ=0;
     
    DateLast=iTime(Symbol(),PERIOD_W1,0);  // Дата начала недели
       
    for (int i=OrdersHistoryTotal()-1;i>=0;i--)
          if (
    OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
             if (
    OrderCloseTime()>DateLast)
                {
                   if (
    OrderProfit()>=0) continue;
                   if (
    OrderProfit()<0summ=summ-OrderProfit();
                }   
     return(
    MathAbs(summ));
    }
    //---------
    double GetRiskSumm()  // Риск по открытм позициям.

    double summ=0
    double point,tick_valuesl;    
    for (
    int i=OrdersTotal()-1;i>=0;i--)      
      if (
    OrderSelect(i,SELECT_BY_POS,MODE_TRADES))            
         {               
             if (
    OrderType()==OP_BUY || OrderType()==OP_BUYSTOP || OrderType()==OP_BUYLIMIT )                   
                {                    
                    if (
    OrderOpenPrice()<=OrderStopLoss()) continue;
                        else
                          {
                             
    point=MarketInfo(OrderSymbol(),MODE_POINT);
                             
    tick_value=MarketInfo(OrderSymbol(),MODE_TICKVALUE); 
                             
    sl=OrderOpenPrice()-OrderStopLoss();
                             
    summ=summ+(sl/point*tick_value*OrderLots());
                          }
                 } 
            if (
    OrderType()==OP_SELL || OrderType()==OP_SELLSTOP || OrderType()==OP_SELLLIMIT )
                 {
                    if (
    OrderOpenPrice()>=OrderStopLoss()) continue;
                       else
                          {
                              
    point=MarketInfo(OrderSymbol(),MODE_POINT);
                              
    tick_value=MarketInfo(OrderSymbol(),MODE_TICKVALUE);
                              
    sl=OrderStopLoss()-OrderOpenPrice(); 
                             
    summ=summ+(sl/point*tick_value*OrderLots());
                          }
                  } 
         }
        return(
    summ);
    }
    [/
    CODE
    Еще интересно можно ли как нибудь отсортировать список ордеров в истории по дате закрытия?! Чтоб не перебирать весь список, а то за несколько месяцев он может стать очень большим.

    Вы не можете благодарить!
    Последний раз редактировалось Adver117; 20.04.2013 в 16:58. Причина: Добавил ф-ию расчета риска по открытым позициям

Страница 1 из 2 1 2 ПоследняяПоследняя

Метки этой темы

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •