Перейти к содержимому

Theme© by Fisana
 

Фотография
* * * * * 1 Голосов

Полезные mql функции


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 91

#61 Necron

Necron

    Пошёл в рукопашку

  • Специалист
  • PipPipPipPipPipPipPipPipPipPipPip
  • 683 сообщений

Отправлено 10 May 2010 - 12:51

Возвращает номер бара экстремума ЗигЗага по его номеру

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

 //|  Возвращает номер бара экстремума ЗигЗага по его номеру.                   |

 //|  Параметры:                                                                |

 //|    sym - наименование инструмента  ("" - текущий символ)                   |

 //|    tf  - таймфрейм                 ( 0 - текущий ТФ)                       |

 //|    ne  - номер экстремума          ( 0 - текущий)                          |

 //|    dp  - ExtDepth                                                          |

 //|    dv  - ExtDeviation                                                      |

 //|    bc  - ExtBackstep                                                       |

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

 int GetExtremumZZBar(string sym="", int tf=0, int ne=0, int dp=12, int dv=5, int bc=3) {

   if (sym=="") sym=Symbol();

   double zz;

   int    i, k=iBars(sym, tf), ke=0;

  

   for (i=1; i<k; i++) {

     zz=iCustom(sym, tf, "ZigZag", dp, dv, bc, 0, i);

     if (zz!=0) {

       ke++;

       if (ke>ne) return(i);

     }

   }

   Print("GetExtremumZZBar(): Экстремум ЗигЗага номер ",ne," не найден");

   return(0);

 }


Каждый сам кузнец своей судьбы.

 
 

#62 Michelangelo®

Michelangelo®

    МОРДЕ-РАПТОР

  • Профи
  • PipPipPipPipPipPipPipPipPipPipPipPipPip
  • 1003 сообщений

Отправлено 19 June 2010 - 09:29

Вот обещал... можно как функцию переписать... а так индючек рассчитывающий размер лота в зависимости от СтолЛосс и процента потерь от депозита...
 //+------------------------------------------------------------------+
 //|                                            i-Lots_Calculator.mq4 |
 //|                                  Copyright © 2010, Michelangelo® |
 //|                                                 karpunin@mail.ru |
 //+------------------------------------------------------------------+
 #property copyright "Copyright © 2010, Michelangelo®"
 #property link      "karpunin@mail.ru"
 
 #property indicator_chart_window
 
 extern string  _pMarginManagement = "----- Параметры ММ -----";
 extern int     _StopLoss    = 50; //Уровень ограничения убытков в пунктах
 extern double  _PerсentLost = 1.0; // Процент убытка в процентах от баланса
 extern string  _pOut="----- Параметры вывода на экран -----";
 extern int     _textSize    = 10; 
 extern int     _xDist       = 730;
 extern int     _yDist       = 35;
 //+------------------------------------------------------------------+
 //| Custom indicator initialization function                         |
 //+------------------------------------------------------------------+
 int init()
   {
 //---- indicators
 //----
    return(0);
   }
 //+------------------------------------------------------------------+
 //| Custom indicator deinitialization function                       |
 //+------------------------------------------------------------------+
 int deinit()
   {
 //----
    
 //----
    return(0);
   }
 //+------------------------------------------------------------------+
 //| Custom indicator iteration function                              |
 //+------------------------------------------------------------------+
 int start()
   {
 //----
    double   _lots=0.0,
             _minLot=0.0,
             _maxLot=0.0,
             _step=0.0,
             _Balans,
             _tickValue;
     
    _minLot=MarketInfo(Symbol(),MODE_MINLOT); // Минимальный размер лота
    _step=MarketInfo(Symbol(),MODE_LOTSTEP); //Шаг изменен размера лота   
    _Balans=AccountBalance(); // Баланс счета
    _maxLot=MarketInfo(Symbol(),MODE_MAXLOT); //Максимальный размер лота
    _tickValue=(MarketInfo(Symbol(), MODE_TICKVALUE)); // Стоимость одного пункта для одного лота
    if (_PerсentLost<=0.0){ // Если процент меньше или равен нулю... 
       _lots=0.0;
    }// End of if (_Percent<=0.0)
    // Если _PercentLost > 0 - вычисляем лот по _PercentLost-у...
    _lots=(((_Balans*_PerсentLost)/100)/_tickValue)/(_StopLoss);
    _lots=MathRound(_lots/_step)*_step;
    if (_lots>_maxLot) _lots=_maxLot;
    // Вывод расчетов на экран...
    ObjectDelete("text1");
    ObjectDelete("text2");
    ObjectDelete("text3");
    ObjectDelete("text4");
    ObjectCreate("text1",OBJ_LABEL,0,0,0);
    ObjectCreate("text2",OBJ_LABEL,0,0,0);
    ObjectCreate("text3",OBJ_LABEL,0,0,0);
    ObjectCreate("text4",OBJ_LABEL,0,0,0);
    ObjectSet("text1",OBJPROP_XDISTANCE,_xDist);
    ObjectSet("text2",OBJPROP_XDISTANCE,_xDist);
    ObjectSet("text3",OBJPROP_XDISTANCE,_xDist);
    ObjectSet("text4",OBJPROP_XDISTANCE,_xDist);
    ObjectSet("text1",OBJPROP_YDISTANCE,_yDist);
    ObjectSet("text2",OBJPROP_YDISTANCE,_yDist+20);
    ObjectSet("text3",OBJPROP_YDISTANCE,_yDist+40);
    ObjectSet("text4",OBJPROP_YDISTANCE,_yDist+60);
    ObjectSetText("text1",Symbol()+" Lot size = "+DoubleToStr(_lots,2),_textSize,"Tahoma",Red);
    ObjectSetText("text2","Actual price (Bid/Ask) = "+DoubleToStr(Bid,Digits)+"/"+DoubleToStr(Ask,Digits),_textSize,"Tahoma",Red);
    ObjectSetText("text3","Tick Value = "+DoubleToStr(_tickValue,2),_textSize,"Tahoma",Red);
    ObjectSetText("text4","StopLoss Level (Buy/Sell) = "+DoubleToStr(Ask-_StopLoss*Point,Digits)+"/"+DoubleToStr(Bid+_StopLoss*Point,Digits),_textSize,"Tahoma",Red);
 //----
 }
 //+------------------------------------------------------------------+

Изображение
Возможно все! ...что ниже скорости света!
Невозможное делаю сразу! Чудо требует незначительной подготовки...
Пришел, увидел, нафлудил...

Изображение

#63 Michelangelo®

Michelangelo®

    МОРДЕ-РАПТОР

  • Профи
  • PipPipPipPipPipPipPipPipPipPipPipPipPip
  • 1003 сообщений

Отправлено 21 June 2010 - 06:43

Конечно приятно, видеть как увеличивается количество просмотров данной ветки, но может мы еще и обсудим функции выложенные здесь... а то игра в одни ворота, ни какого движения вперед... :lol:
Изображение
Возможно все! ...что ниже скорости света!
Невозможное делаю сразу! Чудо требует незначительной подготовки...
Пришел, увидел, нафлудил...

Изображение

#64 Michelangelo®

Michelangelo®

    МОРДЕ-РАПТОР

  • Профи
  • PipPipPipPipPipPipPipPipPipPipPipPipPip
  • 1003 сообщений

Отправлено 21 June 2010 - 23:41

Коллеги, функция trailingProfit у кого-нибудь есть, или опять самому писать придется?
Изображение
Возможно все! ...что ниже скорости света!
Невозможное делаю сразу! Чудо требует незначительной подготовки...
Пришел, увидел, нафлудил...

Изображение

#65 Wizard

Wizard

    Пользователи

  • Свой человек
  • PipPipPipPipPipPipPipPipPip
  • 337 сообщений

Отправлено 23 June 2010 - 09:21




//------- Внешние параметры модуля --------------------------------------------+

extern string _P_Trailing = "---------- Параметры трала";

extern bool UseTrailing      = True;        // Использовать трал

extern bool ProfitTrailing   = True;        // Тралить только профит

extern int  TrailingStopBuy  = 50;          // Фиксированный размер трала

extern int  TrailingStopSell = 50;          // Фиксированный размер трала

extern int  TrailingStep     = 5;           // Шаг трала



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

//|  Сопровождение позиции простым тралом                                      |

//|  Параметры:                                                                |

//|    sy - наименование инструмента   ("" - текущий символ)                   |

//|    op - операция                   (-1 - любая позиция)                    |

//|    mn - MagicNumber                (-1 - любой магик)                      |

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

void TrailingPositions(string sy="", int op=-1, int mn=-1) {

  double p, pp;

  int    i, k=OrdersTotal();



  if (sy=="") sy=Symbol();

  p=MarketInfo(sy, MODE_POINT);

  for (i=0; i<k; i++) {

    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {

      if (OrderSymbol()==sy && (op<0 || OrderType()==op)) {

        if (mn<0 || OrderMagicNumber()==mn) {

          if (OrderType()==OP_BUY) {

            pp=MarketInfo(sy, MODE_BID);

            if (!ProfitTrailing || (pp-OrderOpenPrice())>TrailingStopBuy*p) {

              if (OrderStopLoss()<pp-(TrailingStopBuy+TrailingStep-1)*p) {

                ModifyOrder(sy, -1, pp-TrailingStopBuy*p, 0, clModifyBuy);

              }

            }

          }

          if (OrderType()==OP_SELL) {

            pp=MarketInfo(sy, MODE_ASK);

            if (!ProfitTrailing || OrderOpenPrice()-pp>TrailingStopSell*p) {

              if (OrderStopLoss()>pp+(TrailingStopSell+TrailingStep-1)*p || OrderStopLoss()==0) {

                ModifyOrder(sy, -1, pp+TrailingStopSell*p, 0, clModifySell);

              }

            }

          }

        }

      }

    }

  }

}

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


  • Necron это нравится

#66 Necron

Necron

    Пошёл в рукопашку

  • Специалист
  • PipPipPipPipPipPipPipPipPipPipPip
  • 683 сообщений

Отправлено 23 June 2010 - 10:37

Есть инклюдник с разными тралами. Имеется на сегодняшний день:

ТРЕЙЛИНГ ПО ФРАКТАЛАМ
ТРЕЙЛИНГ ПО ТЕНЯМ N СВЕЧЕЙ
ТРЕЙЛИНГ СТАНДАРТНЫЙ-СТУПЕНЧАСТЫЙ
ТРЕЙЛИНГ СТАНДАРТНЫЙ-"УДАВКА"
ТРЕЙЛИНГ ПО ВРЕМЕНИ
ТРЕЙЛИНГ ПО ATR (Average True Range, Средний истинный диапазон)
ТРЕЙЛИНГ РАСЧЕТ БАРИШПОЛЬЦА
ТРЕЙЛИНГ ПО ЦЕНОВОМУ КАНАЛУ
ТРЕЙЛИНГ ПО СКОЛЬЗЯЩЕМУ СРЕДНЕМУ
ТРЕЙЛИНГ "ПОЛОВИНЯЩИЙ"

К каждому в коде есть описание. Сбросить в папку include, или просто выдирать оттуда функции :)

Прикрепленные файлы


Каждый сам кузнец своей судьбы.

#67 Michelangelo®

Michelangelo®

    МОРДЕ-РАПТОР

  • Профи
  • PipPipPipPipPipPipPipPipPipPipPipPipPip
  • 1003 сообщений

Отправлено 23 June 2010 - 13:14

Коллеги, функция trailingProfit у кого-нибудь есть, или опять самому писать придется?




//------- Внешние параметры модуля --------------------------------------------+
extern string _P_Trailing = "---------- Параметры трала";
extern bool UseTrailing      = True;        // Использовать трал
extern bool ProfitTrailing   = True;        // Тралить только профит
extern int  TrailingStopBuy  = 50;          // Фиксированный размер трала
extern int  TrailingStopSell = 50;          // Фиксированный размер трала
extern int  TrailingStep     = 5;           // Шаг трала

//+----------------------------------------------------------------------------+
//|  Сопровождение позиции простым тралом                                      |
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ("" - текущий символ)                   |
//|    op - операция                   (-1 - любая позиция)                    |
//|    mn - MagicNumber                (-1 - любой магик)                      |
//+----------------------------------------------------------------------------+
void TrailingPositions(string sy="", int op=-1, int mn=-1) {
  double p, pp;
  int    i, k=OrdersTotal();

  if (sy=="") sy=Symbol();
  p=MarketInfo(sy, MODE_POINT);
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy && (op<0 || OrderType()==op)) {
        if (mn<0 || OrderMagicNumber()==mn) {
          if (OrderType()==OP_BUY) {
            pp=MarketInfo(sy, MODE_BID);
            if (!ProfitTrailing || (pp-OrderOpenPrice())>TrailingStopBuy*p) {
              if (OrderStopLoss()<pp-(TrailingStopBuy+TrailingStep-1)*p) {
                ModifyOrder(sy, -1, pp-TrailingStopBuy*p, 0, clModifyBuy);
              }
            }
          }
          if (OrderType()==OP_SELL) {
            pp=MarketInfo(sy, MODE_ASK);
            if (!ProfitTrailing || OrderOpenPrice()-pp>TrailingStopSell*p) {
              if (OrderStopLoss()>pp+(TrailingStopSell+TrailingStep-1)*p || OrderStopLoss()==0) {
                ModifyOrder(sy, -1, pp+TrailingStopSell*p, 0, clModifySell);
              }
            }
          }
        }
      }
    }
  }
}
//+----------------------------------------------------------------------------+



Есть инклюдник с разными тралами. Имеется на сегодняшний день:

ТРЕЙЛИНГ ПО ФРАКТАЛАМ
ТРЕЙЛИНГ ПО ТЕНЯМ N СВЕЧЕЙ
ТРЕЙЛИНГ СТАНДАРТНЫЙ-СТУПЕНЧАСТЫЙ
ТРЕЙЛИНГ СТАНДАРТНЫЙ-"УДАВКА"
ТРЕЙЛИНГ ПО ВРЕМЕНИ
ТРЕЙЛИНГ ПО ATR (Average True Range, Средний истинный диапазон)
ТРЕЙЛИНГ РАСЧЕТ БАРИШПОЛЬЦА
ТРЕЙЛИНГ ПО ЦЕНОВОМУ КАНАЛУ
ТРЕЙЛИНГ ПО СКОЛЬЗЯЩЕМУ СРЕДНЕМУ
ТРЕЙЛИНГ "ПОЛОВИНЯЩИЙ"

К каждому в коде есть описание. Сбросить в папку include, или просто выдирать оттуда функции Изображение



Это был так вопрос с подковыркой на засыпку... Как тралить стоп знают все... А вопрос заключался в том как тралить ПРОФИТ (цель)!!!
Пока господа программеры натянули вы на слабую "троечку"... Изображение

Уточняю вопрос - рассмотрим пример... вы вошли в сделку выставили ТейкПрофит на 100 пунктов, цена берет ваш тейк сделка закрывается, а цена прет дальше еще пунктов на 200-300 вы сидите у монитора и кусаете локти... или еще хуже новички после полученной прибыли кидаются еще раз в догонку уходящему поезду и ловят убыток сжирающие ранее полученную прибыль...
Что делает функция (советник):
- вы первоначально устанавливаете тейкПрофит в 100 пунктов в параметрах функции, как только этот уровень достигается ТП переносится на следующий уровень (сделка при этом не закрывается) для защиты уже полученной, но не пофиксиной прибыли выставляется уровень БУ (потом тралиться обычным способом)... и так пока сделка не закроется по БУ... мы имеем новое значение уровня ТП в пунктах, имеем начальное... после набора статистических данных мы можем определять наиболее выгодный уровень ТП (так сказать самообучающийся ТП)...
Интересно?
Изображение
Возможно все! ...что ниже скорости света!
Невозможное делаю сразу! Чудо требует незначительной подготовки...
Пришел, увидел, нафлудил...

Изображение

#68 Necron

Necron

    Пошёл в рукопашку

  • Специалист
  • PipPipPipPipPipPipPipPipPipPipPip
  • 683 сообщений

Отправлено 20 September 2010 - 00:55

Функция закрывает открытые за некоторый промежуток времени ордера. Возвращает 0 или количество закрытых ордеров.
 /*
 sy - символ ("0" -текущий,""-любой)
 ty - тип ордера (-1 - любой)
 mn - магический номер ордера (-1 -любой)
 tStart - начала периода (количество секунд прошедших после 00:00 1 января 1970 года)
 tEnd - конец периода (количество секунд прошедших после 00:00 1 января 1970 года)
 */
 int ClosePeriodOrders(string sy,int ty,int mn,datetime tStart,datetime tEnd)   {
    int k=OrdersTotal()-1,i,_return=0,dg;
    if(sy=="0") sy=Symbol();
   double   pBid,pAsk;
    for(i=k;i>=0;i--) {
       if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) {
          if(sy==""||OrderSymbol()==sy) {
             if(OrderType()==OP_BUY||OrderType()==OP_SELL)   {   
                if(ty<0||OrderType()==ty)  {
                   if(mn<0||OrderMagicNumber()==mn) {
                      if(OrderOpenTime()>=tStart && OrderOpenTime()<tEnd) {
                         dg=MarketInfo(OrderSymbol(),MODE_DIGITS);
                        pBid=MarketInfo(OrderSymbol(),MODE_BID);
                        pAsk=MarketInfo(OrderSymbol(),MODE_ASK);
                         if(OrderType()==OP_BUY) OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(pBid,dg),3,Green);
                         else if(OrderType()==OP_SELL)  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(pAsk,dg),3,OrangeRed);
                         _return++;
                      }
                   }
                }
             }        
          }
       }
    }
  return(_return); 
 }

Каждый сам кузнец своей судьбы.

#69 Necron

Necron

    Пошёл в рукопашку

  • Специалист
  • PipPipPipPipPipPipPipPipPipPipPip
  • 683 сообщений

Отправлено 01 October 2010 - 22:41

Виртуальный TakeProfit (тейк-профит)

  /*
  sy - символ ("0" -текущий,""-любой)
  ty - тип ордера (-1 - любой)
  mn - магический номер ордера (-1 -любой)
  */
  void VirtualTP(string sy,int ty,int mn)   {
     int k=OrdersTotal()-1,i,dg;
     if(sy=="0")sy=Symbol();
    double   pBid,pAsk;    
    string sym="";
     for(i=k;i>=0;i--) {
        if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) {
           if(sy==""||OrderSymbol()==sy) {
              if(OrderType()==OP_BUY||OrderType()==OP_SELL)   {
                 if(ty<0||OrderType()==ty)  {
                    if(mn<0||OrderMagicNumber()==mn) {
                      sym=OrderSymbol(); 
                 dg=MarketInfo(sym,MODE_DIGITS);
                pBid=MarketInfo(sym,MODE_BID);
                  pAsk=MarketInfo(sym,MODE_ASK);

                       if(OrderType()==OP_BUY) {
                          if(Bid-OrderOpenPrice()>=TakeProfit*PointX(sym))   {
                             OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(pBid,dg),1,Green);
                          }
                       }else 
                       if(OrderType()==OP_SELL)   {
                          if(OrderOpenPrice()-Ask>=TakeProfit*PointX(sym))   {
                             OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(pAsk,dg),1,OrangeRed);
                          }   
                       }
                    }
                 }
              }
           }
        }
     }
   return;  
  }

Каждый сам кузнец своей судьбы.

#70 Necron

Necron

    Пошёл в рукопашку

  • Специалист
  • PipPipPipPipPipPipPipPipPipPipPip
  • 683 сообщений

Отправлено 01 October 2010 - 22:42

Виртуальный StopLoss(стоплосс)
  /*
  sy - символ ("0" -текущий,""-любой)
  ty - тип ордера (-1 - любой)
  mn - магический номер ордера (-1 -любой)
  */
  void VirtualSL(string sy,int ty,int mn)   {
     int k=OrdersTotal()-1,i,dg;
     if(sy=="0")sy=Symbol();
    double   pBid,pAsk;
    string sym="";
     for(i=k;i>=0;i--) {
        if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) {
           if(sy==""||OrderSymbol()==sy) {
              if(OrderType()==OP_BUY||OrderType()==OP_SELL)   {
                 if(ty<0||OrderType()==ty)  {
                    if(mn<0||OrderMagicNumber()==mn) {
                      sym=OrderSymbol(); 
                       dg=MarketInfo(sym,MODE_DIGITS);
                       pBid=MarketInfo(sym,MODE_BID);
                       pAsk=MarketInfo(sym,MODE_ASK);
                      
                       if(OrderType()==OP_BUY) {
                          if(OrderOpenPrice()-Bid>=StopLoss*PointX(sym))   {
                             OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(pBid,dg),1,Green);
                          }
                       }else  
                       if(OrderType()==OP_SELL)   {
                          if(Ask-OrderOpenPrice()>=StopLoss*PointX(sym))   {
                             OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(pAsk,dg),1,OrangeRed);
                          }   
                       }
                    }
                 }
              }
           }
        }
     }
   return;  
  }

Каждый сам кузнец своей судьбы.

#71 Necron

Necron

    Пошёл в рукопашку

  • Специалист
  • PipPipPipPipPipPipPipPipPipPipPip
  • 683 сообщений

Отправлено 01 October 2010 - 22:54

Двойной перевод в безубыток. Принцип работы следующий: сделка вышла в прибыль +TrailingFirstProfit пп (пятизнак учтен) - переносим стоплосс на уровень цена открытия + TrailingFirstDistance пп, затем при достижении прибыли +TrailingSecondProfit пп, стоп переносится на уровень цена открытия ордера + TrailingSecondDistance пп, т.е. дважды двигаем стоп в безубыток.

  extern int     TrailingFirstProfit=30;          //необходимый профит для модификации стопа в первый раз
  extern int     TrailingFirstDistance=5;         //расстояние на которое двигается стоп от безубытка в первый раз
  extern int     TrailingSecondProfit=50;         //необходимый профит для второй модификации
  extern int     TrailingSecondDistance=25;       //расстояние на которое двигается стоп от безубытка во второй раз
  
  /*
  sy - символ ("0" -текущий,""-любой)
  ty - тип ордера (-1 - любой)
  mn - магический номер ордера (-1 -любой)
  */
  
  void DoubleMovingInNoLoss(string sy,int ty,int mn)  {
   int      i,k=OrdersTotal()-1,dg;
   double   po,tmp_v=0.0;
   double   pBid,pAsk;
   if(sy=="0")sy=Symbol();
   for(i=k;i>=0;i--) {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) {
         if(sy==""||OrderSymbol()==sy) {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)  {
               if(mn<0||OrderMagicNumber()==mn) {
                  if(ty<0||OrderType()==ty)  {
                     pBid=MarketInfo(OrderSymbol(),MODE_BID);
                     pAsk=MarketInfo(OrderSymbol(),MODE_ASK);
                     po=MarketInfo(OrderSymbol(),MODE_POINT);
                     dg=MarketInfo(OrderSymbol(),MODE_DIGITS);
                     if(dg==5||dg==3)po*=10;
                     if(OrderType()==OP_BUY) {
                        if((pBid-OrderOpenPrice())>=TrailingFirstProfit*po) {
                           if((pBid-OrderOpenPrice())<TrailingSecondProfit*po)  {
                              tmp_v=OrderOpenPrice()+TrailingFirstDistance*po;
                              if(MathAbs(tmp_v-OrderStopLoss())>=1*po)  {
                                 if(tmp_v>OrderStopLoss())   {
                                    OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(tmp_v,dg),
                                                OrderTakeProfit(),OrderExpiration(),DodgerBlue);
                                 }
                              }
                           }
                           if((pBid-OrderOpenPrice())>=TrailingSecondProfit*po)   {
                              tmp_v=OrderOpenPrice()+TrailingSecondDistance*po;
                              if(MathAbs(tmp_v-OrderStopLoss())>=1*po)  {
                                 if(tmp_v>OrderStopLoss())  {
                                    OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(tmp_v,dg),
                                                OrderTakeProfit(),OrderExpiration(),DodgerBlue);
                                 }
                              }
                           }
                        }   
                     }
                     if(OrderType()==OP_SELL)   {
                        
                        if((OrderOpenPrice()-pAsk)>=TrailingFirstProfit*po) {
                           if((OrderOpenPrice()-pAsk)<TrailingSecondProfit*po)  {
                              tmp_v=OrderOpenPrice()-TrailingFirstDistance*po;
                              if(MathAbs(OrderStopLoss()-tmp_v)>=1*po)   {
                                 if((OrderStopLoss()==0) || (tmp_v<OrderStopLoss()))  {
                                    OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(tmp_v,dg),
                                                OrderTakeProfit(),OrderExpiration(),Orange);
                                 }
                              }
                           }
                           if((OrderOpenPrice()-pAsk)>=TrailingSecondProfit*po) {
                              tmp_v=OrderOpenPrice()-TrailingSecondDistance*po;
                              if(MathAbs(OrderStopLoss()-tmp_v)>=1*po)   {
                                 if((OrderStopLoss()==0) || (tmp_v<OrderStopLoss()))  {
                                    OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(tmp_v,dg),
                                                OrderTakeProfit(),OrderExpiration(),Orange);
                                 }
                              }
                           }
                        }
                     }      
                  }
               }  
            }
         }   
      }
   }
 return;  
}

Каждый сам кузнец своей судьбы.

#72 Necron

Necron

    Пошёл в рукопашку

  • Специалист
  • PipPipPipPipPipPipPipPipPipPipPip
  • 683 сообщений

Отправлено 01 October 2010 - 23:10

В кодах, которые выложил в постах №69 и №70 (VirtualSL && VirtualTP) использую следующую функцию чтобы получить размер пункта для заданного символа:

/*
sy-символ, для которого хотим узнать размер пункта, "0"-текущий, значение по умолчанию
*/
double PointX(string sy="0")   {
   if(sy=="0")sy=Symbol(); 
   int      dg=MarketInfo(sy,MODE_DIGITS);
   double   _return=0.0,
            po=MarketInfo(sy,MODE_POINT);
   if(dg==5||dg==3) _return=po*10;
   else  _return=po;
 return(_return);
}

Каждый сам кузнец своей судьбы.

#73 Necron

Necron

    Пошёл в рукопашку

  • Специалист
  • PipPipPipPipPipPipPipPipPipPipPip
  • 683 сообщений

Отправлено 01 October 2010 - 23:51

Это был так вопрос с подковыркой на засыпку... Как тралить стоп знают все... А вопрос заключался в том как тралить ПРОФИТ (цель)!!!
Пока господа программеры натянули вы на слабую "троечку"... Изображение

Уточняю вопрос - рассмотрим пример... вы вошли в сделку выставили ТейкПрофит на 100 пунктов, цена берет ваш тейк сделка закрывается, а цена прет дальше еще пунктов на 200-300 вы сидите у монитора и кусаете локти... или еще хуже новички после полученной прибыли кидаются еще раз в догонку уходящему поезду и ловят убыток сжирающие ранее полученную прибыль...
Что делает функция (советник):
- вы первоначально устанавливаете тейкПрофит в 100 пунктов в параметрах функции, как только этот уровень достигается ТП переносится на следующий уровень (сделка при этом не закрывается) для защиты уже полученной, но не пофиксиной прибыли выставляется уровень БУ (потом тралиться обычным способом)... и так пока сделка не закроется по БУ... мы имеем новое значение уровня ТП в пунктах, имеем начальное... после набора статистических данных мы можем определять наиболее выгодный уровень ТП (так сказать самообучающийся ТП)...
Интересно?

Michelangelo®, прочитал твой пост - вспомнил. Здесь как ни крути смысла нету тралить тейкпрофит: цена подходит к нету, а он,гад, отодвигается все дальше. И как результат, сделка закроется по SL (в безубытке и по тралу), лучше его (TP) вообще не ставить :)

Если рассматривать "самообучающийся ТП", то здесь можно сделать проще, пусть не совсем то, но уже близко. Обычно ведь выставляем ТП и СЛ в пунктах(если не оговорен иной вариант), а потом оптимизация и т.д.. Более подходящий метод (ИМХО) использование коэффициента от среднего диапазона, не ATR, а High-Low, и затем машку по этим значениям построить. В настройки выносим только сам коэффициент и период машки. Как результат эти значения не нужно оптимизировать для каждой пары отдельно, достаточно прогнать один раз на какой-нибудь и все.
Каждый сам кузнец своей судьбы.

#74 Necron

Necron

    Пошёл в рукопашку

  • Специалист
  • PipPipPipPipPipPipPipPipPipPipPip
  • 683 сообщений

Отправлено 05 October 2010 - 21:42

Если рассматривать "самообучающийся ТП", то здесь можно сделать проще, пусть не совсем то, но уже близко. Обычно ведь выставляем ТП и СЛ в пунктах(если не оговорен иной вариант), а потом оптимизация и т.д.. Более подходящий метод (ИМХО) использование коэффициента от среднего диапазона, не ATR, а High-Low, и затем машку по этим значениям построить. В настройки выносим только сам коэффициент и период машки. Как результат эти значения не нужно оптимизировать для каждой пары отдельно, достаточно прогнать один раз на какой-нибудь и все.

Вот, написал функцию для этого метода, и, соответственно, скрипт для проверки.

 /*
 ty          - тип ордера (см. документацию)
 mode        : 1 - возвращает тейкпрофит, -1 возвращает стоплосс
 avg_period  - период для расчета среднего диапазона
 lvl         - уровень отложенного ордера
 shift       - смещение бара для начала расчета среднего  
 sy          - символ
 tf          - таймфрейм ("0" -текущий)
 */
 double GetOrderLevels(int ty, int mode, int avg_period, double lvl=-1,int shift=1, string sy="0",int tf=0) {
    double   _return=-1, avg=0.0, hh=0.0,ll=0.0;
    double   pAsk=0.0, pBid=0.0;
    if(sy=="0")sy=Symbol();   
    int      dg=MarketInfo(sy,MODE_DIGITS);
    if(tf<0 || (mode!=1 && mode!=-1) || avg_period<0 || ty<0 || ty>6 || (ty>1 && lvl<=0))  {
       Print("Функции "GetOrderLevels" переданы неверные значения параметров!");
       return(-1);
    }
    pAsk=MarketInfo(sy,MODE_ASK);
    pBid=MarketInfo(sy,MODE_BID);
    if(pAsk==0.0 || pBid==0.0)  {
       Print("GetOrderLevels: в обзоре рынка не найден символ "+sy+"!");
       return(-1);
    }
    if(iBars(sy,tf)<avg_period+1) {
       Print("GetOrderLevels: недостаточно истории для расчета среднего значения!");
       return(-1);
    }
    for(int i=shift;i<(shift+avg_period);i++) {
       hh=iHigh(sy,tf,i);
       ll=iLow(sy,tf,i);
       avg+=hh-ll;
    }
    avg/=avg_period;
    if(mode==1) {
       switch(ty)  {
          case OP_BUY:         {_return=Ask+TakeProfit_Koeff*avg;break;}
          case OP_SELL:        {_return=Bid-TakeProfit_Koeff*avg;break;}
          case OP_BUYLIMIT:    {_return=lvl+TakeProfit_Koeff*avg;break;}
          case OP_SELLLIMIT:   {_return=lvl-TakeProfit_Koeff*avg;break;}
          case OP_BUYSTOP:     {_return=lvl+TakeProfit_Koeff*avg;break;}
          case OP_SELLSTOP:    {_return=lvl-TakeProfit_Koeff*avg;break;}
        default:               {break;} 
       }
    }else {
       switch(ty)  {
          case OP_BUY:         {_return=Bid-StopLoss_Koeff*avg;break;}
          case OP_SELL:        {_return=Ask+StopLoss_Koeff*avg;break;}
          case OP_BUYLIMIT:    {_return=lvl-StopLoss_Koeff*avg;break;}
          case OP_SELLLIMIT:   {_return=lvl+StopLoss_Koeff*avg;break;}
          case OP_BUYSTOP:     {_return=lvl-StopLoss_Koeff*avg;break;}
          case OP_SELLSTOP:    {_return=lvl+StopLoss_Koeff*avg;break;}
        default:               {break;} 
       }
    }
    Print("GetOrderLevels: _return="+DoubleToStr(_return,dg));
  return(NormalizeDouble(_return,dg));  
 }

Прикрепленные файлы


  • Michelangelo® это нравится
Каждый сам кузнец своей судьбы.

#75 Night

Night

    Начинающий

  • Пользователи
  • PipPip
  • 4 сообщений

Отправлено 25 November 2010 - 11:42

Всем здравствуйте!
Великолепный раздел для тех кто хочет писАть сам! Очень много полезного нашёл для себя.
Вопрос к Michelangelo, а возможно ли в принципе написание упоминавшегося Вами ТрейлингПрофита?
С уважением, спасибо!



Copyright © 2024 Your Company Name