Результаты опроса:

Голосовавшие
0. Вы ещё не голосовали в этом опросе
  • 0 0%
Форум трейдеров » Торговые роботы, советники, индикаторы » Автотрейдинг. Вопросы новичков
+ Подписаться
Страница 32 из 33 ПерваяПервая ... 2230313233 ПоследняяПоследняя
  1. 107
    Комментарии
    0
    Темы
    107
    Репутация Pro
    Аватар для religare777  
    В начале пути

    2 Медалей
    Добрый день, уважаемые программисты!
    Не подскажите, как переделать индикатор, показывающий график баланса в отдельном окне. Я переделал индикатор, который был в свободном доступе в сети, но он отображает баланс не идентично тому графику, который можно из терминала симпортировать. Вопрос такой: как сделать график, который будет показывать кривую не по количеству сделок, а по времени. Например: прошел 1 час - появилась 1 точка на графике (на уровне этого баланса), прошел еще час - новая точка и т.д., т.е. рисовать кривую баланс/время, а не баланс/сделки.
    Заранее благодарен.

    PHP код:
    //+------------------------------------------------------------------+
    //|                           Balans-8.mq4                            |
    //+------------------------------------------------------------------+
    #property  link      ""
    //---- indicator settings
    #property  indicator_separate_window
    #property  indicator_buffers 3
    #property  indicator_color1  Green
    #property  indicator_color2  Gold
    #property  indicator_width1  2
    #property  indicator_width2  2
    //---- indicator parameters
    extern int Days=0;
    bool Show_info=false;
    //---- indicator buffers
    double     iB[];
    double     iS[];
    double     iT[];
    //---- indicator var
    int wh;
    datetime prevtime;
    double prevbalansmidlevelminlevelmaxlevel;
    #define names "График баланса"
    //+------------------------------------------------------------------+
    int init()
    {
       
    SetIndexBuffer(0,iB);
       
    SetIndexBuffer(1,iS);
       
    SetIndexBuffer(2,iT);
       
    SetIndexStyle(0,DRAW_LINE);
       
    SetIndexStyle(1,DRAW_LINE);
       
    SetIndexStyle(2,DRAW_NONE);
       
    IndicatorDigits(2);
       
    IndicatorShortName(names); // IndicatorShortName(names+"Дней: "+Days);
       
    SetIndexLabel(0,""); //Total balans
       
    SetIndexLabel(1,NULL);
       
    SetIndexLabel(2,NULL);
       if(
    Days==0)    
       {
         
    OrderSelect(0,SELECT_BY_POS,MODE_HISTORY);
         
    Days=MathRound((TimeCurrent()-OrderOpenTime())/(3600*24) + 1);
         if(
    Days<=0Days=1;
         
    Show_info=false;
       } else 
    Show_info=true;
       
    prevbalans=0;
       
    midlevel=0;
       
    minlevel=0;
       
    maxlevel=0;
       
    //if(Days<0) Days=0;
       
    return(0);
    }
    //+------------------------------------------------------------------+
    int start()
    {
       
    int ij=0pt=0lt=0st=0spt=0slt=0;
       
    int htm[][2];
       
    color xxx;
       
    string yyy,yy2;
       
    double уу1,potenzial;
       
    double cpmnlmxl;
       
    double sb=0.0gp=0.0gl=0.0sgp=0.0sgl=0.0;
       
    datetime now=iTime(NULL,0,0);
       
    //----
       
    if(Show_info==false)    
       {
         
    OrderSelect(0,SELECT_BY_POS,MODE_HISTORY);
         
    Days=MathRound((TimeCurrent()-OrderOpenTime())/(3600*24) + 1);
         if(
    Days<=0Days=1;
       }
    //--------------   
       
       
    if(now!=prevtime)
       {
          
    prevtime=now;
          
    prevbalans=0;
       }
       
    double sbalans=AccountBalance();
       if(
    prevbalans==sbalans)return(0);
       
    prevbalans=sbalans;
       
    datetime stday=iTime(Symbol(), PERIOD_D1,0)-Days*PERIOD_D1*60;

       
    int oht=OrdersHistoryTotal();
       
    ArrayResize(htm,oht);
       for(
    i=0i<ohti++)
          if(
    OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
             if(
    OrderType()<=OP_SELL && (OrderCloseTime()>stday || Days==0))
             {
                
    htm[j][0]=OrderCloseTime();
                
    htm[j][1]=OrderTicket();
                
    j++;
             }
       
    ArrayResize(htm,j);
       if(
    htm[j][0]!=&& htm[j][1]!=0ArraySort(htm);
       
    mxl=sbalans;
       
    mnl=sbalans;
       
    iB[0]=sbalans;
       for(
    i=1i<=ji++)
       {
          
    OrderSelect(htm[j-i][1],SELECT_BY_TICKET);
          
    cp=OrderProfit()+OrderCommission()+OrderSwap();
          
    iB[i]=iB[i-1]-cp;
          if(
    cp>=0) { pt++; gp+=cp;} else { lt++; gl+=-cp;}
          if(
    iB[i]>mxlmxl=iB[i];
          if(
    iB[i]<mnlmnl=iB[i];
          if(
    OrderSymbol()==Symbol())
          {
             
    iS[i-1]=iB[i-1];
             
    iS[i]=iB[i];
             
    sb+=cp;
             if(
    cp>=0) { spt++; sgp+=cp;} else { slt++; sgl+=-cp;}
             
    st++;
          } else 
    iS[i]=EMPTY_VALUE;
       }
       
    sbalans=iB[i-1];   
       if(
    sbalans!=midlevel)
       {
          
    midlevel=sbalans;
          
    SetLevelValue(0,midlevel);
       }
       if(
    mxl!=maxlevel)
       {
          
    maxlevel=MathMax(mxl,midlevel);
          
    SetLevelValue(1,maxlevel);
          
    iT[0]=maxlevel+0.1*(maxlevel-minlevel);
       }
       if(
    mnl!=minlevel)
       {
          
    minlevel=MathMin(mnl,midlevel);
          
    SetLevelValue(2,minlevel);
          
    iT[1]=minlevel-0.1*(maxlevel-minlevel);
       }
       if(
    gp-gl>0) {xxx=Limeyyy="Прибыль "yy2="% роста  "уу1=(gp-gl)*100/(AccountBalance()-gp+gl); potenzial=MathPow((уу1/100+1.0),(365.0/Days))*(AccountBalance()-gp+gl);}
       if((
    gp-gl)==||(gl-gp)==0) {xxx=Blueyyy="Прибыль "yy2="% роста  "уу1=0potenzial=MathPow((уу1/100+1.0),(365.0/Days))*(AccountBalance()-gp+gl);}
       if(
    gp-gl<0) {xxx=Redyyy="Убытки "yy2="% убытка  "уу1=(gp-gl)*100/(AccountBalance()+gp-gl); potenzial=MathPow((уу1/100+1.0),(365.0/Days))*(AccountBalance()+gp-gl);}
       
       
    //----
       
    if(!Show_info) return(0);
       
    wh=WindowFind(names); // wh=WindowFind(names+"Дней: "+Days);
       
    show(0Lime"Баланс "+DoubleToStr(AccountBalance(),2)+". Дней: "+Days);
       
    //show(1, Blue, "Валовая прибыль "+DoubleToStr(gp,2));
       //show(2, Red, "Валовые убытки "+DoubleToStr(gl,2));
       
    show(1xxxyyy+DoubleToStr(gp-gl,2));
       
    show(2xxxyy2+DoubleToStr(уу1,2));
       
    show(3xxx"Потенциал "+DoubleToStr(potenzial/AccountBalance(),2)+" раз/год");
       
    show(4Lime"_______________________");
       
    show(5Gold"Профитных сделок "+pt);
       
    show(6Red"Убыточных сделок "+lt);
       
    show(7Lime"Всего сделок "+j);
       
    //show(3, Gold, "Net Profit "+Symbol()+" "+DoubleToStr(sb,2));
       //show(4, Gold, "Gross Profit "+DoubleToStr(sgp,2)
         //       +"  Gross Loss "+DoubleToStr(sgl,2));
       //show(5, Gold, Symbol()+" Trades "+st+"     Profit Trades "+spt+"    Loss Trades "+slt);
    //----wh=WindowFind(names+" Дней - "+Days);
       
       
    return(0);
    }
    //+------------------------------------------------------------------+ 
    void show(int linecolor colstring str)
    {
       
    string sobj=names+line;
       
    int cw=ObjectFind(sobj);
       if(
    cw!=wh)
       {
          if(
    cw>=0ObjectDelete(sobj);
          
    ObjectCreate(sobj,OBJ_LABEL,wh,0,0);
          
    ObjectSet(sobj,OBJPROP_CORNER,0);
          
    ObjectSet(sobj,OBJPROP_XDISTANCE,3);
          
    ObjectSet(sobj,OBJPROP_YDISTANCE,25+line*12);
       }
       
    ObjectSetText(sobj,str,8,"",col);
    }
    //+------------------------------------------------------------------+ 
    int deinit()
    {
       for(
    int i=0i<=5i++) ObjectDelete(names+i);
       return(
    0);
    }
    //+------------------------------------------------------------------+ 
  2. 2,012
    Комментарии
    25
    Темы
    1908
    Репутация Pro
    Аватар для west100  
    Мастер форумных наук

    6 Медалей
    Есть такой индикатор. В настройках только начальный баланс надо правильно указать.
    Вложения Вложения
  3. 107
    Комментарии
    0
    Темы
    107
    Репутация Pro
    Аватар для religare777  
    В начале пути

    2 Медалей
    Цитата Сообщение от west100 Посмотреть сообщение
    Есть такой индикатор. В настройках только начальный баланс надо правильно указать.
    Спасибо! Но он рисует график на минутках так, что приходится прокручивать назад, чтобы его увидеть полностью, т.е. не видно на экране всей кривой графика. Что можно сделать для того, чтобы на минутках полностью был виден?

    С уважением,
    Александр
  4. 107
    Комментарии
    0
    Темы
    107
    Репутация Pro
    Аватар для religare777  
    В начале пути

    2 Медалей
    Разобрался, надо заменить везде код:
    dBuf0[i]
    dBuf1[i]
    на
    dBuf0[i/30]
    dBuf1[i/30]
    чтобы изображение уменьшалось раз в 30, а лучше делить на количество дней исторических данных, чтобы всегда было в пределах экрана.

    Сделал с учетом количества дней исторических данных, по умолчанию - 0. Считает все дни и вне зависимости от количества дней умещает все на минутках в пределах видимого экрана.
    Спасибо Виктору еще раз!

    Код:
    //+----------------------------------------------------------------------------+
    //|                                                              i-BalEq2.mq4  |
    //|                                                    Ким Игорь В. aka KimIV  |
    //|                                                       http://www.kimiv.ru  |
    //|                                                                            |
    //|  01.10.2006  График баланса и эквити.                                      |
    //|  23.06.2007  Добавил расчёт стоимости пункта, учёл спред и своп. =Xupypr=  |
    //|  04.07.2011  Добавил ограничение графика пределами экрана trader.forex@list.ru 
    //+----------------------------------------------------------------------------+
    #property copyright "Ким Игорь В. aka KimIV"
    #property link      "http://www.kimiv.ru"
    
    #property indicator_separate_window
    #property indicator_buffers 2
    #property indicator_color1 Lime
    #property indicator_width1 2
    #property indicator_color2 Red
    #property indicator_width2 1
    
    //------- Внешние параметры индикатора ----------------------------------------+
    extern int Days=0;
    extern double Deposit       = 5000.0; // Начальный депозит
    bool   CurSymbolOnly = false;  // Учитывать только текущий инструмент
    //------- Буферы индикатора ---------------------------------------------------+
    double dBuf0[], dBuf1[];
    
    //------- Глобальные переменные индикатора ------------------------------------+
    int    oob[]; // номер бара открытия
    int    oty[]; // тип
    double olo[]; // лот
    string osy[]; // инструмент
    double oop[]; // цена открытия
    int    ocb[]; // номер бара закрытия
    double ocp[]; // цена закрытия
    double osw[]; // своп
    double opr[]; // прибыль
    
    //+----------------------------------------------------------------------------+
    //|  Custom indicator initialization function                                  |
    //+----------------------------------------------------------------------------+
    void init()
    {
     IndicatorDigits(2);
     SetIndexBuffer(0,dBuf0);
     SetIndexLabel (0,"Balance");
     SetIndexStyle (0,DRAW_LINE);
     
     SetIndexBuffer(1,dBuf1);
     SetIndexLabel (1,"Equity");
     SetIndexStyle (1,DRAW_LINE);
    }
    //+----------------------------------------------------------------------------+
    //|  Custom indicator iteration function                                       |
    //+----------------------------------------------------------------------------+
    void start()
    {
     double b,e,p,s,t;
     int    i,j,k;
    
     
     if(Days==0)    
      {
         OrderSelect(0,SELECT_BY_POS,MODE_HISTORY);
         Days=MathRound((TimeCurrent()-OrderOpenTime())/(3600*24) + 1);
         if(Days<=0) Days=1;
      }
    
     
     
     ReadDeals();
     if (oob[0]<0) return;
     k=ArraySize(oob);
    
     for (i=Bars;i>=oob[0];i--)
     {
      dBuf0[i/Days]=EMPTY_VALUE; 
      dBuf1[i/Days]=EMPTY_VALUE;
     }
     b=Deposit;
     for (i=oob[0];i>=0;i--)
     {
      e=0;
      for (j=0;j<k;j++)
      {
       if (i==ocb[j] && ocp[j]!=0) b+=osw[j]+opr[j];
       else if (i<=oob[j] && i>=ocb[j])
       {
        p=MarketInfo(osy[j],MODE_POINT);
        s=p*MarketInfo(osy[j],MODE_SPREAD);
        t=NormalizeDouble(TickValue(osy[j],i),2);
        if (t==0) t=10;
        if (p==0) if (StringFind(osy[j],"JPY")<0) p=0.0001; else p=0.01;
        if (oty[j]==OP_BUY) e+=(iClose(osy[j],0,i)-oop[j])/p*olo[j]*t;
        else e+=(oop[j]-iClose(osy[j],0,i)-s)/p*olo[j]*t;
        if (osw[j]!=0) e+=(oob[j]-i)*(osw[j]/(oob[j]-ocb[j]));
       }
      }
      dBuf0[i/Days]=b;
      dBuf1[i/Days]=b+e;
     }
    }
    
    //+----------------------------------------------------------------------------+
    //|  Чтение сделок                                                             |
    //+----------------------------------------------------------------------------+
    void ReadDeals()
    {
     ArrayResize(oob,0);
     ArrayResize(oty,0);
     ArrayResize(olo,0);
     ArrayResize(osy,0);
     ArrayResize(oop,0);
     ArrayResize(ocb,0);
     ArrayResize(ocp,0);
     ArrayResize(osw,0);
     ArrayResize(opr,0);
     
     int h=OrdersHistoryTotal(),i,k;
    
     for (i=0;i<h;i++)
     {
      if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
      {
       if (!CurSymbolOnly || OrderSymbol()==Symbol())
       {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL)
        {
         k=ArraySize(oob);
         ArrayResize(oob,k+1);
         ArrayResize(oty,k+1);
         ArrayResize(olo,k+1);
         ArrayResize(osy,k+1);
         ArrayResize(oop,k+1);
         ArrayResize(ocb,k+1);
         ArrayResize(ocp,k+1);
         ArrayResize(osw,k+1);
         ArrayResize(opr,k+1);
         oob[k]=iBarShift(NULL,0,OrderOpenTime());  // номер бара открытия
         oty[k]=OrderType();                        // тип
         olo[k]=OrderLots();                        // лот
         osy[k]=OrderSymbol();                      // инструмент
         oop[k]=OrderOpenPrice();                   // цена открытия
         ocb[k]=iBarShift(NULL,0,OrderCloseTime()); // номер бара закрытия
         ocp[k]=OrderClosePrice();                  // цена закрытия
         osw[k]=OrderSwap();                        // своп
         opr[k]=OrderProfit();                      // прибыль
        }
       }
      }
     }
     h=OrdersTotal();
     for (i=0;i<h;i++)
     {
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
       if (!CurSymbolOnly || OrderSymbol()==Symbol())
       {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL)
        {
         k=ArraySize(oob);
         ArrayResize(oob,k+1);
         ArrayResize(oty,k+1);
         ArrayResize(olo,k+1);
         ArrayResize(osy,k+1);
         ArrayResize(oop,k+1);
         ArrayResize(ocb,k+1);
         ArrayResize(ocp,k+1);
         ArrayResize(osw,k+1);
         ArrayResize(opr,k+1);
         oob[k]=iBarShift(NULL,0,OrderOpenTime()); // номер бара открытия
         oty[k]=OrderType();                       // тип
         olo[k]=OrderLots();                       // лот
         osy[k]=OrderSymbol();                     // инструмент
         oop[k]=OrderOpenPrice();                  // цена открытия
         ocb[k]=0;                                 // номер бара закрытия
         ocp[k]=0;                                 // цена закрытия
         osw[k]=OrderSwap();                       // своп
         opr[k]=OrderProfit();                     // прибыль
        }
       }
      }
     }
    }
    
    //+----------------------------------------------------------------------------+
    //|  Определение стоимости пункта                                              |
    //+----------------------------------------------------------------------------+
    double TickValue(string symbol, int bar)
    {
     double value=MarketInfo(symbol,MODE_TICKVALUE);
     if (StringLen(symbol)!=6) return(value);
     double size=MarketInfo(symbol,MODE_LOTSIZE)*MarketInfo(symbol,MODE_TICKSIZE);
     if (StringSubstr(symbol,3,3)=="USD") return(value);
     else if (StringSubstr(symbol,0,3)=="USD") value=size/iClose(symbol,0,bar);
     else
     {
      string BQ=StringSubstr(symbol,0,3)+"USD";
      if (iClose(BQ,0,0)==0) BQ="USD"+StringSubstr(symbol,0,3);
      if (iClose(BQ,0,0)==0) return(value);
      if (StringSubstr(BQ,0,3)=="USD") value=size/iClose(BQ,0,bar)/iClose(symbol,0,bar);
      else value=size*iClose(BQ,0,bar)/iClose(symbol,0,bar);
     } 
     return(value);
    }
    //+----------------------------------------------------------------------------+
  5. 107
    Комментарии
    0
    Темы
    107
    Репутация Pro
    Аватар для religare777  
    В начале пути

    2 Медалей
    Добрый день всем!
    Есть идея советника/индикатора, который будет определять волатильность валютной пары на определенных участках времени. Самому не хватает опыта сделать, может быть кто-нибудь заинтересуется, а я смогу доделать с удобным выводом на экран основных расчетов.
    Большинство индикаторов совершенно неинформативны. По правде, когда смотрю на них, возникает ощущение, что ту же кривую цены (которую и так никто не может понять) пропустили через ряд фильтров и она стала еще "кривее" и бесполезнее.
    Короче, в чем соль задачи:
    Волатильность подразумевает движение цены в одном направлении большее, чем в другом за определенный промежуток времени.
    Исходя из этой предпосылки необходимо определить участки (дня) наиболее волатильные и коэффициент волатильности на них.
    Т.е. берется за начало отчета каждый час в течение периода (скажем 100 дней) и предустановленный путь цены (скажем 40 pip)
    Например: 15.00 первого дня и определяется какой путь пройдет цена за пределы уровня 40 pip максимально, прежде чем вернется на этот же уровень, но только в обратную сторону. Т.е. предположим цена поднималась и перешагнула уровень 40 pip и прошла еще 20 pip, прежде чем она вернулась и прошла вниз от исходного уровня 40 pip. Таким образом, коэффициент волатильности - 1,5 (=60/40). Далее то же самое для 15.00 второго дня... сотого дня. рассчитывается средний и минимальный коэффициент для 15.00.
    Если сделать расчет для начала каждого часа (00.00, 01.00... 23.00), можно определить коэффициенты для каждого часа суток.
    Коэффициент покажет, насколько перспективно и в какое время использовать стратегии, основанные на волатильности для данной пары.
    Объяснил несколько сумбурно. Если кто заинтересуется, объясню подробнее.
    С уважением,
    Александр
  6. 283
    Комментарии
    4
    Темы
    283
    Репутация Pro
     
    В начале пути

    2 Медалей
    Господа, добрый день. Подскажите, как заставить эксперт рисовать линию эквити? я создал массив состоящий из эквити, но не знаю, что далее делать с ним.
  7. 1,481
    Комментарии
    24
    Темы
    1497
    Репутация Pro
    Аватар для aus  
    ПэкМэк

    5 Медалей
    Цитата Сообщение от goodle06 Посмотреть сообщение
    Господа, добрый день. Подскажите, как заставить эксперт рисовать линию эквити? я создал массив состоящий из эквити, но не знаю, что далее делать с ним.
    Возьми , к примеру , Momentum.mq4 и замени на свой массив что там нужно , ну и вычисления инда не забудь убрать . Вроде бы так можно .
  8. 4,164
    Комментарии
    7
    Темы
    4265
    Репутация Pro
    Аватар для Денис Давыдов  
    Мастер форумных наук

    4 Медалей
    Цитата Сообщение от goodle06 Посмотреть сообщение
    Господа, добрый день. Подскажите, как заставить эксперт рисовать линию эквити? я создал массив состоящий из эквити, но не знаю, что далее делать с ним.
    Строение индикаторов смотрите, советником рисовать не надо. aus правильно заметил, что за основу можно взять другой индикатор, но всё же лучше самому почитать про них и написать заново.
  9. 1,481
    Комментарии
    24
    Темы
    1497
    Репутация Pro
    Аватар для aus  
    ПэкМэк

    5 Медалей
    Цитата Сообщение от goodle06 Посмотреть сообщение
    ... как заставить эксперт рисовать линию эквити? ...
    Цитата Сообщение от Денис Давыдов Посмотреть сообщение
    Строение индикаторов смотрите, советником рисовать не надо. aus правильно заметил, что за основу можно взять другой индикатор, но всё же лучше самому почитать про них и написать заново.
    Я про эксперт и не заметил :) , а вот для чего эквити рисовать :) - очень интересно было б узнать ? - а вдруг что-то нужное ? ;)

    Из эксперта можно - пример не под рукой , если действительно нужно , goodle06 - пиши , потом посмотрю , там переадресовка вроде простая ...
  10. 4,164
    Комментарии
    7
    Темы
    4265
    Репутация Pro
    Аватар для Денис Давыдов  
    Мастер форумных наук

    4 Медалей
    Цитата Сообщение от aus Посмотреть сообщение
    Я про эксперт и не заметил :) , а вот для чего эквити рисовать :) - очень интересно было б узнать ? - а вдруг что-то нужное ? ;)
    Для анализа истории счёта.

    Цитата Сообщение от aus Посмотреть сообщение
    Из эксперта можно - пример не под рукой , если действительно нужно , goodle06 - пиши , потом посмотрю , там переадресовка вроде простая ...
    Из эксперта можно конечно, но рисовать придётся трендовыми линиями и их будет очень много, комп подтупливать начнёт.

Вверх
РегистрацияX

чтобы писать, читать, комментировать