Ошибки, баги, вопросы - страница 623

 
MetaDriver:
Вот щас тобе точно нагрубят... :))

Наверно,

вчитался в суть проблемы, не пойму зачем в каждом индикаторе таймер ставить, да и вообще зачем эта куча индикаторов,

если можно в таймере советника напрямую получать биды нужного инструмента? и складировать в общую сборку,

в таком варианте дискретность будет в порядке а в варианте с индикаторами имеем несинхронизированный поток данных.

другое дело со шпионами, они ведь не имеют тактов и событий по всем инструментам может не быть долго а могут и один за другим тикать.

ЗЫ кстати в дилингах где имеется цена Last, данных по Bid не всегда есть, так что через проверочку пишем либо Bid если нет то Last.

 

MetaDriver:

Предлагаю компромисс: ловишь тики шпионами и сразу отправляешь в головной эксперт, снабдив милисекундной меткой(GetTickCount()). Эксперт их упорядочивает в соответствии с метками и нарезает секундные блоки.

Не очень просто, зато с точностью будет порядок.

Неплохой вариант. На мой взгляд единственные который стоит взять за основу.

Urain:

ЗЫ кстати в дилингах где имеется цена Last, данных по Bid не всегда есть, так что через проверочку пишем либо Bid если нет то Last.

Хорошее уточнение, не сталкивался с таким. Нужно будет учесть.
 

MetaDriver:

Предлагаю компромисс: ловишь тики шпионами и сразу отправляешь в головной эксперт, снабдив милисекундной меткой(GetTickCount()). Эксперт их упорядочивает в соответствии с метками и нарезает секундные блоки.

Не очень просто, зато с точностью будет порядок.

Interesting:

Неплохой вариант. На мой взгляд единственные который стоит взять за основу.

Хорошее уточнение, не сталкивался с таким. Нужно будет учесть.

Вариант может и не плохой, только механизм отправки тиков отсутствует в терминале. Прикиньте 5-10 тиков/сек да по 16 парам. Еще раз, - это уже прошли))

И точность не нужна такая - достаточно 1сек.

В общем, всем спасибо - данную тему закончил.

 

 Проблема очень неприятная, связанная с подменой минутных баров на бары более высоких таймфреймов в далёком историческом прошлом, когда ещё не велась поминутная история. Из решений на ум приходит только сложная конвертация подложных баров в настоящие, да и это без гарантий точности. Дело даже не столько в сложности, сколько в сомнениях относительно точности такой конвертации.

 Изначальная задача состоит в проверке актуальности выстраиваемых Временных Зон Фибоначчи. Если зона слишком отдалённая и рабочая ширина всех её субзон (по дефолту - до 34 единиц базовой ширины) суммарно столь узка, что правая граница не достаёт до настоящего момента, то мы её не строим, в противном случае создадим объект на чарте. Пытался решить двумя схожими способами, один из которых привожу. Разница лишь в том, что в первом способе я плясал от начала истории с использованием

   datetime firstDate=(datetime)SeriesInfoInteger(_Symbol,_Period,SERIES_FIRSTDATE);
 а во втором - наоборот (привожу этот способ), суть и результаты абсолютно не меняются. Тестировал на NZD/USD.

 Если у вас подставная история заканчивается не в 2009 году, как у меня, а на другой дате, перестройте эти две Fibo Time Zones так, чтобы одна из них проходила через эту переломную дату, а вторая - была бы уже полностью в правой части истории, где все бары настоящие. В этом случае не забудьте также поменять в скрипте значения startTime1, endTime1 и при необходимости  startTime2, endTime2; цены можно не подгонять - это непринципиально. Теперь можно протестировать... Результат будет печален: при неизменном алгоритме проверки для обоих таймзон он верно сработает лишь для исторически правосторонней зоны, а та, что одной ногой до переломной даты, а другой - после, алгоритм ошибочно отфильтрует и не даст нам её построить. Замечу, что обе зоны располагаются довольно близко друг к другу и имеют схожую ширину, а две эти ширины простираются далеко в будущее и ещё долго будут актуальны, в действительности ни одна из них не должна быть отфильтрована (закомментируйте условия и увидите, что построились обе таймзоны).

void OnStart()
  {
   datetime startTime1=D'2009.07.08 18:00:00';
   datetime endTime1=D'2009.11.03 12:17:00';
   datetime startTime2=D'2009.06.30 08:00:00';
   datetime endTime2=D'2009.10.21 20:16:00';

   double startPrice1=0.61930;
   double endPrice1=0.70948;
   double startPrice2=0.65470;
   double endPrice2=0.76300;

   int FTZ1pos1,FTZ2pos1,bandwidth;
   datetime Arr[],time1;

   CopyTime(_Symbol,PERIOD_M1,0,1,Arr);
   time1=Arr[0];

   FTZ1pos1=CopyTime(_Symbol,PERIOD_M1,time1,startTime1,Arr);
   bandwidth=CopyTime(_Symbol,PERIOD_M1,endTime1,startTime1,Arr)*(34+2); // +2 - небольшой запас общей ширины
                                                                         // зоны на всякий случай

   if(FTZ1pos1<=bandwidth)
      ObjectCreate(0,"FTZ1",OBJ_FIBOTIMES,0,
                   startTime1,startPrice1,
                   endTime1,endPrice1
                  );


// ---
   FTZ2pos1=CopyTime(_Symbol,PERIOD_M1,time1,startTime2,Arr);
   bandwidth=CopyTime(_Symbol,PERIOD_M1,endTime2,startTime2,Arr)*(34+2); // +2 - небольшой запас общей ширины
                                                                         // зоны на всякий случай

   if(FTZ2pos1<=bandwidth)
      ObjectCreate(0,"FTZ2",OBJ_FIBOTIMES,0,
                   startTime2,startPrice2,
                   endTime2,endPrice2
                  );
  }

  Желаемый результат:Должно быть две Fibo Time Zone

 Где-то между первой и второй 0-й базовой линией проходит переломная граница, разделяющая подложные минутные бары и настоящие.

 Если же отказаться от расчётов в количестве баров, а всё вычислять в датах, то это уж точно не даст желаемой точности, так как придётся вычитать выходные (+/- час закрытия/открытия рынка), праздники и т. д., а уж о пропуске баров при отсутствии тиков более минуты и расхождении с временнОй шкалой я вообще молчу.

  Что посоветуете в качестве надёжного решения?

 

Ошибка загрузки файла в советнике .  Из разряда найдите 10 отличий . Первый код относится к срипту .Второй к советнику , они идентичны Ctrl-C   Ctrl-V. В скрипте код работает , в советнике нет.

#include <\\MyClass\RegulFind-v1-1.mqh>
#include <Trade\Trade.mqh>
int hMa,hRsi ;
double mMa[],mRsi[];                             
Kohonen  koh;
CTrade trade ;
void OnStart()
  {
   koh.LoadMap("KitMaRsi.csv") ;
   hMa=iMA(_Symbol,Period(),10,0,MODE_EMA,PRICE_CLOSE) ;
   if(hMa ==INVALID_HANDLE)
      Print("Ошибка загрузки машки====================== ",GetLastError());
   hRsi=iRSI(_Symbol,Period(),10,PRICE_CLOSE);
   if(hRsi ==INVALID_HANDLE)
      Print(" Ошибка загрузки РСИ ==========");   
   
  }
#include <\\MyClass\RegulFind-v1-1.mqh>
#include <Trade\Trade.mqh>
int hMa,hRsi ;
double mMa[],mRsi[];                             
Kohonen  koh;
CTrade trade ;
int OnInit()
  {
   koh.LoadMap("KitMaRsi.csv") ;
   hMa=iMA(_Symbol,Period(),10,0,MODE_EMA,PRICE_CLOSE) ;
   if(hMa ==INVALID_HANDLE)
      Print("Ошибка загрузки машки====================== ",GetLastError());
   hRsi=iRSI(_Symbol,Period(),10,PRICE_CLOSE);
   if(hRsi ==INVALID_HANDLE)
      Print(" Ошибка загрузки РСИ ==========");   
   return(0);
  }
 
ivandurak:

Ошибка загрузки файла в советнике .  Из разряда найдите 10 отличий . Первый код относится к срипту .Второй к советнику , они идентичны Ctrl-C   Ctrl-V. В скрипте код работает , в советнике нет.

 

В тестере другая файловая песочница. Если хотите, чтобы эксперт в тестере и обычным способом работали с одним файлом *.csv, кладите его в common директорию и открывайте файл с модификатором FILE_COMMON


P.S. Чтобы положить в общую(common) папку, нужно либо записать файл с модификатором
FILE_COMMON, либо найти что-то типа этого (вариант для XP):

C:\Documents and Settings\All Users\Application Data\MetaQuotes\Terminal\Common\Files\



 
x100intraday:

  Что посоветуете в качестве надёжного решения?

Назад, в MT4.

О будущем этой проблемы обращался к разработчикам, они отмолчались, так что лично для меня перспективы непонятны. 

 

Как то не работает switch с символьными переменными...

Вместо:

string type = "Buy";

switch(type)
{
case "Buy" : {direction = ORDER_TYPE_BUY;  price = SymbolInfoDouble(zSymbol,SYMBOL_ASK); break;}
case "Sell": {direction = ORDER_TYPE_SELL; price = SymbolInfoDouble(zSymbol,SYMBOL_BID); break;}
default: {return(lot_value);}
}

'type' - illegal switch expression type  
'Buy' - constant expression is not integral

Приходится рисовать так:

if(zShift == "Buy")  {direction = ORDER_TYPE_BUY;  price = SymbolInfoDouble(zSymbol,SYMBOL_ASK);}
if(zShift == "Sell") {direction = ORDER_TYPE_SELL; price = SymbolInfoDouble(zSymbol,SYMBOL_BID);}
if(zShift != "Buy" || zShift != "Sell") {return(lot_value);}

что не так наглядно да и кривовато.

На других языках прокатывает...

Надо как-то по другому писать?

 
awkozlov:

Как то не работает switch с символьными переменными...


В документации сказано (выделено мною) - Оператор-переключатель switch:

Сравнивает значение выражения с константами во всех вариантах case и передает управление оператору, который соответствует значению выражения. Каждый вариант case может быть помечен целой константой, символьной константой или константным выражением. Константное выражение не может включать переменные или вызовы функций. Выражение оператора switch должно быть целого типа.

 
awkozlov:

На других языках прокатывает...

То что на других прокатывает это фича. Switch изначально был предназначен только для интегральных типов. Здесь такой фичи нет.