Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
//+------------------------------------------------------------------+ //| GANN_rvm_v3.mq4 | //| Copyright © 2005, MetaQuotes Software Corp. | //| http://www.metaquotes.net | //+------------------------------------------------------------------+ #property copyright "Copyright © 2005, MetaQuotes Software Corp." #property link "http://www.metaquotes.net" #property indicator_chart_window #property indicator_buffers 8 #property indicator_color1 DeepSkyBlue #property indicator_color2 Black #property indicator_color3 DeepSkyBlue #property indicator_color4 Black #property indicator_color5 Yellow #property indicator_color6 DarkKhaki #property indicator_color7 AntiqueWhite #property indicator_color8 NavajoWhite //---- input parameters extern int NextTF=15; extern int BLin_Range=5; extern int HLNext_Range=3; extern bool HLNext_UseFullTF=false; //---- buffers double HLNextUp_sl[]; double HLNextDn_sl[]; double HLNextUp[]; double HLNextDn[]; double BLev[]; double BStep[]; double ExtMapBuffer7[]; double ExtMapBuffer8[]; double MyArr[][10]; //---- bool initfl=0; //флаг инициализации int ArrIdx; //последний индекс массива int lb,lbars; //индекс последнего расчитанного бара и количество расчитанных баров int idFile,dig; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- indicators SetIndexStyle(0,DRAW_LINE,STYLE_DOT); SetIndexStyle(1,DRAW_LINE,STYLE_DOT); SetIndexStyle(2,DRAW_LINE,STYLE_SOLID); SetIndexStyle(3,DRAW_LINE,STYLE_SOLID); SetIndexStyle(4,DRAW_LINE,STYLE_SOLID); SetIndexStyle(5,DRAW_LINE,STYLE_SOLID); SetIndexStyle(6,DRAW_LINE); SetIndexStyle(7,DRAW_LINE); SetIndexBuffer(0,HLNextUp_sl); SetIndexBuffer(1,HLNextDn_sl); SetIndexBuffer(2,HLNextUp); SetIndexBuffer(3,HLNextDn); SetIndexBuffer(4,BLev); SetIndexBuffer(5,BStep); SetIndexBuffer(6,ExtMapBuffer7); SetIndexBuffer(7,ExtMapBuffer8); SetIndexEmptyValue(0,0.0); SetIndexEmptyValue(1,0.0); SetIndexEmptyValue(2,0.0); SetIndexEmptyValue(3,0.0); SetIndexEmptyValue(4,0.0); SetIndexEmptyValue(5,0.0); SetIndexLabel(0,"Sell Stop (M"+NextTF+","+HLNext_Range+")"); SetIndexLabel(1,"Buy Stop (M"+NextTF+","+HLNext_Range+")"); SetIndexLabel(2,"Sell Stop (M"+NextTF+","+HLNext_Range+")"); SetIndexLabel(3,"Buy Stop (M"+NextTF+","+HLNext_Range+")"); SetIndexLabel(4,"Balans Point (M"+NextTF+","+BLin_Range+")"); SetIndexLabel(5,"Balans Step (M"+NextTF+","+BLin_Range+")"); //---- FileDelete("tmp.csv"); idFile=FileOpen("tmp.csv",FILE_CSV|FILE_READ|FILE_WRITE,";"); return(0); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { int counted_bars=IndicatorCounted(); int limit,cb,i; //---- //начальная инициализация индикатоа if( initfl!=1 ) { myInit(); if( initfl!=1 ) return(-1); } //определение интервала расчета и отрисовки индикатора if( counted_bars<0 ) { return(-1); } else { if( Bars-1-counted_bars<=0 ) { limit=0; } else { limit=Bars-1-counted_bars; } } //цикл по барам for( cb=limit;cb>=0;cb--) { if( cb!=Bars-1 ) { if( cb==Bars-1-lb && lbars==Bars ) { //действия если это не новый бар //if( cb==0 ) FileWrite(idFile," 2.Бар не новый "); ACET(cb); } else { //действия если этот бар не соответствует началу бара старшего т-ф if( BBarBegin(cb,NextTF)!=1 ) { if( cb==0 ) FileWrite(idFile,"--- 1.Новый бар "+cb,(Bars-1-cb)+" "+TimeToStr(Time[cb])); ACEB(cb); } else { if( cb==0 ) FileWrite(idFile,"*** 0.Новый бар старшего т-ф "+cb,(Bars-1-cb)+" "+TimeToStr(Time[cb])); ACEBB(cb); } } } else { ACF(cb); } //if( cb==0 ) FileWrite(idFile,MyArr[ArrIdx][0],MyArr[ArrIdx][1],MyArr[ArrIdx][2],MyArr[ArrIdx][3],MyArr[ArrIdx][4],MyArr[ArrIdx][5],MyArr[ArrIdx][6],MyArr[ArrIdx][7],MyArr[ArrIdx][8],MyArr[ArrIdx][9]); //отрисовываем основные линии High Low Next Activator if( HLNext_UseFullTF!=1 ) { if( Close[cb]>MyArr[ArrIdx-1][8] ) { HLNextUp[cb]=0; HLNextDn[cb]=MyArr[ArrIdx-1][9]; } else { if( Close[cb]<MyArr[ArrIdx-1][9] ) { HLNextUp[cb]=MyArr[ArrIdx-1][8]; HLNextDn[cb]=0; } else { if( HLNextUp[cb+1]>0 ) { HLNextUp[cb]=MyArr[ArrIdx-1][8]; HLNextDn[cb]=0; } else { HLNextUp[cb]=0; HLNextDn[cb]=MyArr[ArrIdx-1][9]; } } } } else { if( MyArr[ArrIdx-1][5]>MyArr[ArrIdx-2][8] ) { HLNextUp[cb]=0; HLNextDn[cb]=MyArr[ArrIdx-1][9]; } else { if( MyArr[ArrIdx-1][5]<MyArr[ArrIdx-2][9] ) { HLNextUp[cb]=MyArr[ArrIdx-1][8]; HLNextDn[cb]=0; } else { if( HLNextUp[cb+1]>0 ) { HLNextUp[cb]=MyArr[ArrIdx-1][8]; HLNextDn[cb]=0; } else { HLNextUp[cb]=0; HLNextDn[cb]=MyArr[ArrIdx-1][9]; } } } } //отрисовываем балансовые линии и вспомогательные для High Low Next Activator for( i=Bars-1-MyArr[ArrIdx][0];i>=Bars-1-MyArr[ArrIdx][1];i-- ) { BLev[i] =MyArr[ArrIdx][6]; BStep[i] =MyArr[ArrIdx][7]; HLNextUp_sl[i]=MyArr[ArrIdx][8]; HLNextDn_sl[i]=MyArr[ArrIdx][9]; } lb=Bars-1-cb; lbars=Bars; } //---- return(0); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| Custor indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- FileClose(idFile); //---- return(0); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ // Функция начальной инициализации индикатора | //+------------------------------------------------------------------+ void myInit() { int ArrSize,Displacement,arcount,i; //---- //определяем количество баров младшего т-ф содержащихся в баре старшего т-ф if( NextTF<10080) { Displacement=NextTF/Period(); } else { if( NextTF==10080 ) { Displacement=7200/Period(); } else { if( NextTF==43200 ) { Displacement=31680/Period(); } } } //--------- SetIndexShift(0,Displacement); SetIndexShift(1,Displacement); SetIndexShift(4,Displacement); SetIndexShift(5,Displacement); SetIndexDrawBegin(0,Displacement*HLNext_Range); SetIndexDrawBegin(1,Displacement*HLNext_Range); SetIndexDrawBegin(2,Displacement*HLNext_Range); SetIndexDrawBegin(3,Displacement*HLNext_Range); SetIndexDrawBegin(5,Displacement*BLin_Range); SetIndexDrawBegin(6,Displacement*BLin_Range); //--------- //если неверно указаны параметры BLin_Range,HLNext_Range if( BLin_Range<1 || HLNext_Range<1 ) { Alert("Неверно указаны параметры иникатора!"); return(-1); } //если на графике недостаточно данных if( Bars<MathMax(BLin_Range,HLNext_Range)*Displacement ) { Alert("На графике недостаточно данных"); return(-1); } //если неверно указан параметр NextTF if( NextTF<=Period() ) { Alert("Неверно указан параметр NextTF !/n Значение должно быть больше /n текущего т-ф в минутах"); return(-1); } //количество знаков до которых будут округляться расчеты dig=Digits; //определяем необходимый размер массива и его последний индекс if( BLin_Range>HLNext_Range ) { ArrSize=BLin_Range; } else { ArrSize=HLNext_Range; } ArrIdx=ArrSize-1; //100 попыток на изменение размера массива for( i=0;i<100;i++) { arcount=ArrayResize(MyArr,ArrSize); if( arcount>0 ) { break; } } initfl=1; //---- return(0); } //+------------------------------------------------------------------+ //+--------------------------------------------------------------------+ //| Функция возвращает истину, если бар является началом бара старшего | //| т-ф | //+--------------------------------------------------------------------+ bool BBarBegin(int bar, int TF) { //---- bool bbegin=0; if(TF!=10080) { bbegin=MathFloor(Time[bar]/TF/60)-MathFloor(Time[bar+1]/TF/60); } else { bbegin=MathFloor((Time[bar]+259200)/TF/60)-MathFloor((Time[bar+1]+259200)/TF/60); } //---- return(bbegin); } //+--------------------------------------------------------------------+ //+--------------------------------------------------------------------+ //| Функция заполняет массив данных если это не новый бар | //+--------------------------------------------------------------------+ void ACET(int bi) { //---- int i; double sBPoints,sHigh,sLow; //записываем значения параметров бара старшего т-ф if( High[bi]>MyArr[ArrIdx][3] ) MyArr[ArrIdx][3]=High[bi]; if( Low[bi] <MyArr[ArrIdx][4] ) MyArr[ArrIdx][4]=Low[bi]; MyArr[ArrIdx][5]=Close[bi]; //точка баланса MyArr[ArrIdx][6]=NormalizeDouble((MyArr[ArrIdx][3]+MyArr[ArrIdx][4]+MyArr[ArrIdx][5])/3,dig); //ступень баланса for( i=ArrIdx;i>=ArrIdx+1-BLin_Range;i-- ) { sBPoints+=MyArr[i][6]; } MyArr[ArrIdx][7]=NormalizeDouble(sBPoints/BLin_Range,dig); //уровни BuyStop SellStop for( i=ArrIdx;i>=ArrIdx+1-HLNext_Range;i-- ) { sHigh+=MyArr[i][3]; sLow +=MyArr[i][4]; } MyArr[ArrIdx][8]=NormalizeDouble(sHigh/HLNext_Range,dig); MyArr[ArrIdx][9]=NormalizeDouble(sLow/HLNext_Range,dig); //---- return(0); } //+--------------------------------------------------------------------+ //+--------------------------------------------------------------------+ //| Функция заполняет массив данных если этот бар не является началом | //| бара старшего т-ф | //+--------------------------------------------------------------------+ void ACEB(int bi) { //---- //изменяем индекс бара завершающего бар старшего т-ф MyArr[ArrIdx][1]=Bars-1-bi; ACET(bi); //---- return(0); } //+--------------------------------------------------------------------+ //+--------------------------------------------------------------------------+ //| Функция заполняет массив данных если этот бар - начало бара старшего т-ф | //+--------------------------------------------------------------------------+ void ACEBB(int bi) { //---- int i; double sBPoints,sHigh,sLow; //сдвиг по стеку данных в массиве for( i=0;i<ArrIdx;i++ ) { MyArr[i][0]=MyArr[i+1][0]; MyArr[i][1]=MyArr[i+1][1]; MyArr[i][2]=MyArr[i+1][2]; MyArr[i][3]=MyArr[i+1][3]; MyArr[i][4]=MyArr[i+1][4]; MyArr[i][5]=MyArr[i+1][5]; MyArr[i][6]=MyArr[i+1][6]; MyArr[i][7]=MyArr[i+1][7]; MyArr[i][8]=MyArr[i+1][8]; MyArr[i][9]=MyArr[i+1][9]; if( bi==0 ) FileWrite(idFile," инд. № "+i,MyArr[i][0],MyArr[i][1],MyArr[i][2],MyArr[i][3],MyArr[i][4],MyArr[i][5],MyArr[i][6],MyArr[i][7],MyArr[i][8],MyArr[i][9]); } //заполняем массив MyArr[ArrIdx][0]=Bars-1-bi; MyArr[ArrIdx][1]=Bars-1-bi; MyArr[ArrIdx][2]=Open[bi]; MyArr[ArrIdx][3]=High[bi]; MyArr[ArrIdx][4]=Low[bi]; MyArr[ArrIdx][5]=Close[bi]; MyArr[ArrIdx][6]=NormalizeDouble((MyArr[ArrIdx][3]+MyArr[ArrIdx][4]+MyArr[ArrIdx][5])/3,dig); for( i=ArrIdx;i>=ArrIdx+1-BLin_Range;i-- ) { sBPoints+=MyArr[i][6]; } MyArr[ArrIdx][7]=NormalizeDouble(sBPoints/BLin_Range,dig); for( i=ArrIdx;i>=ArrIdx+1-HLNext_Range;i-- ) { sHigh+=MyArr[i][3]; sLow +=MyArr[i][4]; } MyArr[ArrIdx][8]=NormalizeDouble(sHigh/HLNext_Range,dig); MyArr[ArrIdx][9]=NormalizeDouble(sLow/HLNext_Range,dig); if( bi==0 ) FileWrite(idFile," инд. № "+ArrIdx,MyArr[ArrIdx][0],MyArr[ArrIdx][1],MyArr[ArrIdx][2],MyArr[ArrIdx][3],MyArr[ArrIdx][4],MyArr[ArrIdx][5],MyArr[ArrIdx][6],MyArr[ArrIdx][7],MyArr[ArrIdx][8],MyArr[ArrIdx][9]); //---- return(0); } //+--------------------------------------------------------------------+ //+--------------------------------------------------------------------+ //| Функция вносит первую запись в массив | //+--------------------------------------------------------------------+ void ACF(int bi) { //---- int i; double sBPoints,sHigh,sLow; //записываем значения параметров бара старшего т-ф MyArr[ArrIdx][0]=Bars-1-bi; MyArr[ArrIdx][1]=Bars-1-bi; MyArr[ArrIdx][2]=Open[bi]; MyArr[ArrIdx][3]=High[bi]; MyArr[ArrIdx][4]=Low[bi]; MyArr[ArrIdx][5]=Close[bi]; MyArr[ArrIdx][6]=NormalizeDouble((MyArr[ArrIdx][3]+MyArr[ArrIdx][4]+MyArr[ArrIdx][5])/3,dig); for( i=ArrIdx;i>=ArrIdx+1-BLin_Range;i-- ) { sBPoints+=MyArr[i][6]; } MyArr[ArrIdx][7]=NormalizeDouble(sBPoints/BLin_Range,dig); for( i=ArrIdx;i>=ArrIdx+1-HLNext_Range;i-- ) { sHigh+=MyArr[i][3]; sLow +=MyArr[i][4]; } MyArr[ArrIdx][8]=NormalizeDouble(sHigh/HLNext_Range,dig); MyArr[ArrIdx][9]=NormalizeDouble(sLow/HLNext_Range,dig); //---- return(0); } //+--------------------------------------------------------------------+при "появлении" нового бара старшего т-ф вызывается функция ACEBB() которая осуществляет "сдвиг по стеку" в массиве данных, запись с индексом 0 заменяется на запись с индексом 1 и т.д. почему-то в реал-тайм этот сдвиг осуществляется некорректно, вот вывод в файл
Уже на втором сдвиге наблюдается что данные для записи с индексом 0 были взяты не из записи с индексом 1, а из записи с индексом 2, нигде больше работа с индексами меньше последнего работа не ведется, только с последним, при присоединении индикатора на график, он на протяжении всей истории отрисовывается правильно, а вот в реал-тайм начинает "гнать", может уже чего не замечаю?
У меня был такая непонятка, я ожидал, что при поступлении нового бара в цикле (for cnt=limit;cnt>=0;cnt--) Я ожидал, что при новом баре отсчет будет идти от cnt=1, ан не тут то было, оказалось, что немного криво limit посчитан.
... //сдвиг по стеку данных в массиве for( i=0;i<ArrIdx;i++ ) { MyArr[i][0]=MyArr[i+1][0]; MyArr[i][1]=MyArr[i+1][1]; MyArr[i][2]=MyArr[i+1][2]; MyArr[i][3]=MyArr[i+1][3]; MyArr[i][4]=MyArr[i+1][4]; MyArr[i][5]=MyArr[i+1][5]; MyArr[i][6]=MyArr[i+1][6]; MyArr[i][7]=MyArr[i+1][7]; MyArr[i][8]=MyArr[i+1][8]; MyArr[i][9]=MyArr[i+1][9]; if( bi==0 ) FileWrite(idFile," инд. № "+i,MyArr[i][0],MyArr[i][1],MyArr[i][2],MyArr[i][3],MyArr[i][4],MyArr[i][5],MyArr[i][6],MyArr[i][7],MyArr[i][8],MyArr[i][9]); } ... //---- return(0); }индекс записи берется верный, но там уже почему-то все сдвинуто? вызов сдвига проходит единожды, иначе было бы видно в выводе в файл???
16. Добавлены новые режимы в функцию MarketInfo(). Подробная информация во встроенной помощи MetaEditor;
Попробовал новые режимы, но не пойму почему TICKVALUE и TICKSIZE возвращают 0.
выяснил, просто провел синхронизацию с другим источником
Нормализовать я так понимаю с помощью Point, других инструментов я не знаю... Если они есть, то подскажит пожалуйста.
Округление числа с плавающей запятой до указанной точности.
Параметры
value - Величина с плавающей точкой.
digits - Формат точности, число цифр после десятичной точки (0-8).
Пример
double var1=0.123456789;
Print(NormalizeDouble(var1,5));
// вывод: 0.12346
MarketInfo( Symbol(), MODE_DIGITS );
инд.тек. бара отн./абс. дата время *** 0.Новый бар старшего т-ф 0;350351 2005.10.18 21:15 санкция ежетиковая проверка 0 элемент в 0 записи изменен 350339.00000000;350341;1.7499;1.75;1.749;1.7492;1.7494;1.7501;1.7507;1.7496 --- 1.Новый бар 0;350352 2005.10.18 21:20 ежетиковая проверка 0 элемент в 0 записи изменен 350342.00000000;350344;1.749;1.7496;1.7477;1.7492;1.7488;1.7499;1.7502;1.7487 --- 1.Новый бар 0;350353 2005.10.18 21:25 *** 0.Новый бар старшего т-ф 0;350354 2005.10.18 21:30 санкция ежетиковая проверка 0 элемент в 0 записи изменен 350345.00000000;350347;1.7491;1.7498;1.749;1.7494;1.7494;1.7497;1.7498;1.7486если нашли ошибку кивните головой пожалуйста :)
Эти параметры актуальны для фьючерсных контрактов, а для остальных инструментов не используются. Хотя TICKSIZE надо бы вместо 0 все равно показывать как 1/pow(10,digits) , например 0.0001 , а в TICKVALUE автоматически выдавать стоимость тика/пипса.
Постараемся в следующем билде реализовать.