Здравствуйте. Вопрос такой. Есть эксперт, который использует длл. Я так понимаю, что обмен данными идет с каждым тиком. Возможно ли ограничить этот процесс например раз в час или в 30 минут в зависимости от выбранного таймфрейма.
- Реальные и сгенерированные тики - Алгоритмический трейдинг, торговые роботы
- Стандартная - Панели инструментов
- Запуск - Добро пожаловать в алготрейдинг
Олег:
Здравствуйте. Вопрос такой. Есть эксперт, который использует длл. Я так понимаю, что обмен данными идет с каждым тиком. Возможно ли ограничить этот процесс например раз в час или в 30 минут в зависимости от выбранного таймфрейма.
Если нет исходного кода эксперта, то нет.
Здравствуйте. Вопрос такой. Есть эксперт, который использует длл. Я так понимаю, что обмен данными идет с каждым тиком. Возможно ли ограничить этот процесс например раз в час или в 30 минут в зависимости от выбранного таймфрейма.
Alexey Volchanskiy:
Если нет исходного кода эксперта, то нет.
Если нет исходного кода эксперта, то нет.
#import "MyDll.dll" double _functionW1(const double &Buffer1[121],const double &Buffer2[121],const double &Buffer3[121],const double &Buffer4[121],const double &Buffer5[121],double & ExtMapBuffer23[145]); #import extern int TakeProfit =26; // тейк-профит, пунктов от текущей цены extern int StopLoss =50; // стоп, пунктов от текущей цены extern int Slippage =6; //проскальзование extern double digit=0; double SL,TP; bool select1,select2,close1,close2; int Ticket1,Ticket2,Magic,Magic1; double Lots =0.1; int init() { if( Digits==3 || Digits==5) { TakeProfit *=10; StopLoss *=10; Slippage *=10; } return(0); } int start() { double Buffer1[121]; double Buffer2[121]; double Buffer3[121]; double Buffer4[121]; double Buffer5[121]; for(int j1=1; j1<=121; j1++) { Buffer1[121-j1]=iClose(NULL,0,j1*16-15); Buffer2[121-j1]=iClose(NULL,0,j1*8-7); Buffer3[121-j1]=iClose(NULL,0,j1*4-3); Buffer4[121-j1]=iClose(NULL,0,2*j1-1); Buffer5[121-j1]=iClose(NULL,0,j1); } double ExtMapBuffer23[145]; ZeroMemory(ExtMapBuffer23); int nDllResult = CallDllFunc(Buffer1,Buffer2,Buffer3,Buffer4,Buffer5, ExtMapBuffer23); if(nDllResult == 0) { if(openord()==0) { if (ExtMapBuffer23[120]<ExtMapBuffer23[121]) { SL=NormalizeDouble(Ask-StopLoss*Point,Digits); TP=NormalizeDouble(Ask+TakeProfit*Point,Digits); int send1=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,SL,TP,"My order",111,0,clrBlue); } if (ExtMapBuffer23[120]>ExtMapBuffer23[121]) { SL=NormalizeDouble(Bid+StopLoss*Point,Digits); TP=NormalizeDouble(Bid-TakeProfit*Point,Digits); int send2=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,SL,TP,"My order",222,0,clrRed); } } if (ExtMapBuffer23[120]>ExtMapBuffer23[121]) { select1=OrderSelect(0,SELECT_BY_POS); Magic=OrderMagicNumber(); if (Magic==111) { Ticket1=OrderTicket(); close1=OrderClose(Ticket1,Lots,Bid,Slippage,clrBlack); } } if (ExtMapBuffer23[120]<ExtMapBuffer23[121]) { select2=OrderSelect(0,SELECT_BY_POS); Magic1=OrderMagicNumber(); if (Magic1==222) { Ticket2=OrderTicket(); close2=OrderClose(Ticket2,Lots,Ask,Slippage,clrBlack); } } } return(0); } int CallDllFunc(const double & Buffer1[],const double & Buffer2[],const double & Buffer3[],const double & Buffer4[],const double & Buffer5[], double & ExtMapBuffer23[]) { bool nRetValue = 0; // проверка параметров if(ArraySize(Buffer1) != 121 || ArraySize(ExtMapBuffer23) != 145) { nRetValue = -1; } else { // аргументы проверены на коррекнтость, теперь можно вызывать функцию из длл nRetValue = _functionW1(Buffer1,Buffer2,Buffer3,Buffer4,Buffer5,ExtMapBuffer23); } return(nRetValue); } // функция подсчета количества открытых ордеров int openord(){ int ord=0; for(int cnt=0; cnt<OrdersTotal(); cnt++){ if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)==true){ if(OrderMagicNumber()==111 || OrderMagicNumber()==222) { if(OrderSymbol()==Symbol()){ if(OrderType()<2) ord++; } } } } return(ord); }
Олег:
Вот так
extern PeriodMinutes = 30;
int CallDllFunc(const double & Buffer1[],const double & Buffer2[],const double & Buffer3[],const double & Buffer4[],const double & Buffer5[], double & ExtMapBuffer23[]) { bool nRetValue = 0; static datetime dtLast = TimeCurrent(); // проверка параметров if(ArraySize(Buffer1) != 121 || ArraySize(ExtMapBuffer23) != 145) { nRetValue = -1; } else { if(TimeCurremt() - dtLast > PeriodMinutes * 60) { // аргументы проверены на коррекнтость, теперь можно вызывать функцию из длл nRetValue = _functionW1(Buffer1,Buffer2,Buffer3,Buffer4,Buffer5,ExtMapBuffer23); dtLast = TimeCurremt(); } } return(nRetValue); }
Ну тогда - проще простого:
... int nDllResult = -1; if (IsNewBar()) nDllResult = CallDllFunc(Buffer1,Buffer2,Buffer3,Buffer4,Buffer5, ExtMapBuffer23); ... bool IsNewBar() { static datetime lastBarTime = 0; if (lastBarTime == iTime(NULL, 0, 0)) return false; lastBarTime = iTime(NULL, 0, 0); return true; }
Ihor Herasko:
При чем тут привязка к новому бару? Требуется время задавать
Ну тогда - проще простого
спасибо большое!!
кончайте уже использовать статические переменные и учить этому тоже не надо.
почему такое предосудительное отношение к статическим переменным
Они не сбрасываются в ините. Этого достаточно чтобы заработать себе кучу проблем.
Alexey Oreshkin:
Они не сбрасываются в ините. Этого достаточно чтобы заработать себе кучу проблем.
Их смысл в этом и заключается - чтобы не сбрасывались при смене таймфрейма, например. Если нужно обнулять при перезапуске - обнуляйте явно.
Они не сбрасываются в ините. Этого достаточно чтобы заработать себе кучу проблем.
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь