Торговые системы: Show Must Go On... или очередное возвращение к ZigZag'у - страница 3

 
kharko:

......что Зигзиг на любом ТФ надо строить, используя котировки М1... Готовый результат перенести на старший ТФ...

 

вариантов несчитано :)...... главное во всех этих временах не запутаться и чтобы быстродействие не сильно пострадало
 
rider:вариантов несчитано :)...... главное во всех этих временах не запутаться и чтобы быстродействие не сильно пострадало


вариантов действительно масса... быстродействие страдает... ведь используются котировки на младших ТФ, а, значит, в расчет берется больше баров, чем на основном графике... еще надо следить, чтобы на младшем ТФ была закачена история без "дыр"... Теперь сравним ЗигЗаг с котировками М1 (желтая линия) и Н1 (голубая линия)...

ExtDepth =1...

 

или ExtDepth =4

 

Котировки с младших ТФ показывают наиболее приближенный результат к реальному движению цены...

 
kharko:

.......

ExtDepth =1...

Результат, скажем так, "на любителя", так же как и в моем случае..... Здесь оценка зависит от того кто и что от него получить хочет и для чего использовать. А вот один момент в реализации заинтересовал........Почту посмотрите.

 

Отличная работа, снимаю шляпу.

Для себя добавил бы :

1. Возможность автоматической установки отрисовываемых ТФ в зависимости от текущего ТФ с помощью коэффициентов

kS,kM,kL. Причём для каждого ТФ можно заранее установить коэффициенты предпочитаемых периодов.Например -

для М5-1/3/4 и т.д.

Ручками при каждом переключении ТФ как-то лень.


2.Выводить индикацию об отрисовываемых ТФ, после второго переключеня забываю где я. Т.е в правом нижнем углу цифирки

15-30-240 и всё ясно.

#property copyright "Copyright © 2008, BiViSi Corp."
#property link      "riderfin@bk.ru"
#property link      "ICQ 499949112"
 
#property indicator_chart_window    
#property indicator_buffers 3
//---- стиль  индикаторной линии
#property indicator_color1 Blue 
#property indicator_color2 Gold
#property indicator_color3 Indigo        
#property indicator_style1 0
#property indicator_style2 0
#property indicator_style3 0
#property indicator_width1 8
#property indicator_width2 5
#property indicator_width3 2
//---- ВХОДНЫЕ ПАРАМЕТРЫ ИНДИКАТОРА 
extern int VolExt=25; // вычисление "VolExt+1" последних опорных точек
extern int TFLarge=240;
extern int TFMidle=120;
extern int TFSmall=30;
extern string TF="auto";
extern int kS=1;
extern int kM=4;
extern int kL=4;
//---- Variables 
double Large[],Midle[],Small[];  // опорные точки (буферы индикатора)
datetime PrevTimePer[4];         // времена последнего расчета по каждому ТФ
datetime PrevTimeCalc=0; 
double P60,CP60;
int CurPeriod, ErrorTF=0, NumberExt, Per,  largelast=0, midlelast=0, smalllast=0;
static bool Up1,Up2,Up3,Dn1,Dn2,Dn3;
//-----------------------------------------------------------------------
int init() 
{
   // инициализация 
   IndicatorBuffers(3); // строка "на перспективу" :)
   SetIndexBuffer(0,Large); SetIndexStyle(0,DRAW_SECTION);
   SetIndexEmptyValue(0,0.0);
   SetIndexBuffer(1,Midle); SetIndexStyle(1,DRAW_SECTION);
   SetIndexEmptyValue(1,0.0); 
   SetIndexBuffer(2,Small); SetIndexStyle(2,DRAW_SECTION);
   SetIndexEmptyValue(2,0.0);
   ArrayInitialize(PrevTimePer,0);
   CurPeriod=Period(); CP60=CurPeriod*60;
   // Ограничения:
   // контроль ТФ и введенных параметров
   
   
   
   /*if (MathCeil(TFSmall/CurPeriod) != TFSmall/CurPeriod) 
      TFSmall=MathCeil(TFSmall/CurPeriod)*CurPeriod;
   if (MathCeil(TFMidle/CurPeriod) != TFMidle/CurPeriod)
      TFMidle=MathCeil(TFMidle/CurPeriod)*CurPeriod;
   if (MathCeil(TFLarge/CurPeriod) != TFLarge/CurPeriod)
       TFLarge=MathCeil(TFLarge/CurPeriod)*CurPeriod;
   if (CurPeriod > TFSmall) 
      {Alert ("Период графика должен быть меньше или равен ", TFSmall," мин.");
       ErrorTF=1;return;}
   //if (TFSmall >= TFMidle || TFMidle >= TFLarge || TFLarge>43200)
    //  {Alert ("Некорректный выбор таймфреймов для расчета!!!"); ErrorTF=1;return;}*/
   return;              
}
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   ObjectDelete("Гор1");
   ObjectDelete("Гор2");
   ObjectDelete("Гор3"); 
//----
   return(0);
  }
//--------------------------------------------------------------------
int start()
{
   double   top=WindowPriceMax();
   double botton=WindowPriceMin();
   string гор1,гор2,гор3;
   color cvet1,cvet2,cvet3;
   if ( ErrorTF==1 ) return; // некорректный таймфрейм 
   if(TF=="auto")
   {
    if(CurPeriod==5)    kM=6; 
    if(CurPeriod==15)   kM=2;
    if(CurPeriod==240) {kM=2;kL=3;гор3="4H";гор2="8H";гор1="24H";}
    if(CurPeriod==1440){kM=5;kL=2;гор3="1D";гор2="5D";гор1="10D";}
    if(CurPeriod==10080){kM=4;kL=2;гор3="1W";гор2="4W";гор1="8W";}
    TFSmall=kS*CurPeriod; TFMidle=TFSmall*kM; TFLarge=TFMidle*kL;
   }  
   if(CurPeriod<=60||TF!="auto")
   {гор3=TFSmall;
    гор2=TFMidle;
    гор1=TFLarge;
    }
   int dist=MathFloor(((top-botton)/30)/Point);
   ObjectDelete("Гор1");
   ObjectDelete("Гор2");
   ObjectDelete("Гор3"); 
   FractalCalc();
   if(Up3)cvet3=Blue; if(Dn3) cvet3=Red;
   if(Up2)cvet2=Blue; if(Dn2) cvet2=Red;
   if(Up1)cvet1=Blue; if(Dn1) cvet1=Red;
   LabelCreate1("Гор1",3,10,3*dist,гор1,15,cvet1);
   LabelCreate1("Гор2",3,10,2*dist,гор2,15,cvet2);
   LabelCreate1("Гор3",3,10,1*dist,гор3,15,cvet3);
   
   return;
}
////////////////////////////////////////////////////////////////////////////////
 
bool LabelCreate1 ( string _LabelName,int _LabelCorner, int _Xdist, int _Ydist,
                   string text,int widt,color cvet)
/////////////////////////////////////////////////////////////////////////////////
// Создание объекта "Текстовая метка" с именем _LabelName.
// Координаты: х = _LabelXDistance, у = _LabelYDistance, угол - _LabelCorner.
/////////////////////////////////////////////////////////////////////////////////
{
   
    ObjectCreate( _LabelName, OBJ_LABEL,0,0,0); 
    ObjectSet(_LabelName,OBJPROP_CORNER,_LabelCorner); 
    ObjectSet(_LabelName,OBJPROP_XDISTANCE,_Xdist); 
    ObjectSet(_LabelName,OBJPROP_YDISTANCE,_Ydist);
    ObjectSetText ( _LabelName,text ,widt,"Arial Black",cvet );
    
}

3.Поскольку линии накладываются скрывая нижних желательно эти цифирки окрашивать в соответствующий цвет.Например вверх-синий, вниз красный.

Вот первые два пункта реалзовал без проблем а с третьим проблема. Я использовал флаги Up/Dn устанавливаемые в функции вычисления фрактала ( в той части где вычисляются вершины и донышки). И облом . На некоторых ТФ цвета совпадают, на некоторых перевернуты, вобщем нет системы. Очевидно я не совсем понял логику работы функции. А может это связано с тем, что я прлверял в выходные.

Привожу кусок кода ф-ии где устанавливаются флаги

// ищем опорные точки
         if(High[up3]>High[up2] && High[up3]>High[up1] 
            && High[up3]>=High[up4] && High[up3]>=High[up5])
            {
            if (y==1){Large[up3]=High[up3];largelast=up3;Up1=false;Dn1=true;}
            if (y==2){Midle[up3]=High[up3];midlelast=up3;Up2=false;Dn2=true;}
            if (y==3){Small[up3]=High[up3];smalllast=up3;Up3=false;Dn3=true;}
            NumberExt++;  extr++;
            }
         if(Low[dn3]<Low[dn2] && Low[dn3]<Low[dn1] 
            && Low[dn3]<=Low[dn4] && Low[dn3]<=Low[dn5])
            {
            if (y==1){Large[dn3]=Low[dn3];largelast=dn3;Up1=true;Dn1=false;}
            if (y==2){Midle[dn3]=Low[dn3];midlelast=dn3;Up2=true;Dn2=false;}
            if (y==3){Small[dn3]=Low[dn3];smalllast=dn3;Up3=true;Dn2=false;}
            NumberExt++; extr++;
            }
         if (NumberExt>VolExt) break;   
         }

Просьба:

1.Не могли бы Вы посмотреть код и помочь решить эту проблему с цветом?

2.Нельзя ли другим способом определять пики оставив отрисовку Вашу?

3.Не могли бы Вы поподробней писать способ вычислений на нестандартных ТФ без их конвертации? Поскольку мой предпочитаемый ТФ 2 часа для меня это интересно.

Прилагаю картинки показывающие результат. Как приложить код не нашел.


1H


4H


1D


Так и картинки не пошли.

Подскажите как вставить правильно картинку и приктепить код.

 

vlad1949  писал(а):



Спасибо за оценку. Так думаю, что здесь в комментариях прикрепленные файлы просто не предусмотрены. На форуме топик есть - там можно: 'Статья: Show Must Go On... или очередное возвращение к ZigZag'у'

Но картинки однозначно вставляться должны, если с путями и форматами ничего не напутали.

Что касается цвета, то, честно говоря, пока не понял, что вы хотите разными цветами маркировать, но то, что в том виде как вы написали работать это не будет мне уже понятно:

// ищем опорные точки
         if(High[up3]>High[up2] && High[up3]>High[up1] 
            && High[up3]>=High[up4] && High[up3]>=High[up5])
            {
            if (y==1){Large[up3]=High[up3];largelast=up3;Up1=false;Dn1=true;}
            if (y==2){Midle[up3]=High[up3];midlelast=up3;Up2=false;Dn2=true;}
            if (y==3){Small[up3]=High[up3];smalllast=up3;Up3=false;Dn3=true;}
            NumberExt++;  extr++;
            }
         if(Low[dn3]<Low[dn2] && Low[dn3]<Low[dn1] 
            && Low[dn3]<=Low[dn4] && Low[dn3]<=Low[dn5])
            {
            if (y==1){Large[dn3]=Low[dn3];largelast=dn3;Up1=true;Dn1=false;}
            if (y==2){Midle[dn3]=Low[dn3];midlelast=dn3;Up2=true;Dn2=false;}
            if (y==3){Small[dn3]=Low[dn3];smalllast=dn3;Up3=true;Dn2=false;}
            NumberExt++; extr++;
            }
         if (NumberExt>VolExt) break;   
         }

Ваши Up и Dn нигде не запоминаются и в конечном итоге принимают значение по последнему найденному фракталу...... а во второй части кода очистка производится, и не факт, что этот фрактал в построении зигзага участвовать будет. Видимо, значения им там присваивать нужно, но..... код так построен, что в том месте ничто ничему не присваивается, а только обнуляется....  :( . Нужно Вам там кое-что переписать будет, без этого не обойтись.

Еще одно. Вот этот не маленький кусочек:

int start()
{
   double   top=WindowPriceMax();
   double botton=WindowPriceMin();
   string гор1,гор2,гор3;
   color cvet1,cvet2,cvet3;
   if ( ErrorTF==1 ) return; // некорректный таймфрейм 
   if(TF=="auto")
   {
    if(CurPeriod==5)    kM=6; 
    if(CurPeriod==15)   kM=2;
    if(CurPeriod==240) {kM=2;kL=3;гор3="4H";гор2="8H";гор1="24H";}
    if(CurPeriod==1440){kM=5;kL=2;гор3="1D";гор2="5D";гор1="10D";}
    if(CurPeriod==10080){kM=4;kL=2;гор3="1W";гор2="4W";гор1="8W";}
    TFSmall=kS*CurPeriod; TFMidle=TFSmall*kM; TFLarge=TFMidle*kL;
   }  
   if(CurPeriod<=60||TF!="auto")
   {гор3=TFSmall;
    гор2=TFMidle;
    гор1=TFLarge;
    }
   int dist=MathFloor(((top-botton)/30)/Point);
   ObjectDelete("Гор1");
   ObjectDelete("Гор2");
   ObjectDelete("Гор3"); 
   FractalCalc();
   if(Up3)cvet3=Blue; if(Dn3) cvet3=Red;
   if(Up2)cvet2=Blue; if(Dn2) cvet2=Red;
   if(Up1)cvet1=Blue; if(Dn1) cvet1=Red;
   LabelCreate1("Гор1",3,10,3*dist,гор1,15,cvet1);
   LabelCreate1("Гор2",3,10,2*dist,гор2,15,cvet2);
   LabelCreate1("Гор3",3,10,1*dist,гор3,15,cvet3);
   
   return;
}

у вас на каждом тике выполнятся будет. Оно вам надо? Может логичнее все что одноразовое в init вынести?
Индикатор хотя и шустр, но аппаратные ресурсы беречь все равно нужно. 

И последнее, по таймфремам. Все расчеты на двух китах держатся: CurPerid - период графика к которому он прикреплен и Per - период рассчитываемого зигзага. Никогда эмуляцией нестандартных не занимался (в индикаторе "нестандартными" могут быть только Per), но если у вас в этом есть необходимость и вы будете прикреплять его на H2 (допустим), то нужно просто в функции init (или через extern) 

int init() 
{
   // инициализация 
   IndicatorBuffers(3); // строка "на перспективу" :)
   //............
   SetIndexEmptyValue(2,0.0);
   ArrayInitialize(PrevTimePer,0);
   //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
   CurPeriod=Period(); CP60=CurPeriod*60;
   //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
   // Ограничения:
   // контроль ТФ и введенных параметров
   //...............
   return;              
}

задать нужное значение для CurPeriod, так как функция Period() на нестандартном ТФ вряд ли заработает. После этого все должно работать.... теоретически :)





 
vlad1949:

Для себя добавил бы :

1. Возможность автоматической установки отрисовываемых ТФ......


Для себя и добавьте :)

Я не ерничаю vlad1949, просто мыслЕй и так хватает, а на каждый чих не надышишься...... к примеру, мне недавно захотелось, чтобы при одном вызове через icustom у меня все посчитанные массивы были доступны..... ан нет - mql не разрешает.... так и и извращаюсь черезь глобальные.... или недавно обнаружил, что ускорить его еще можно.... так все равно руки не дошли, пока не подперло.....

Код, дело интимное :)

И извините, плз, что вовремя не ответил :)