![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
MrWigglesworth Вот версия с добавлением демы как типа 4: ma__dema_crossover_with_arrow_and_email.mq4
Отлично! Большое спасибо за вашу помощь MLaden
С праздником!!!![](https://c.mql5.com/forextsd/smiles/party.png)
Кто-нибудь знает, как я могу автоматически узнать GMT брокера (не мой собственный GMT) из кода?
Кто-нибудь знает, как я могу узнать GMT брокера автоматически (не мое собственное GMT) из кода?
Нет автоматического способа узнать брокера (такой информации нет во всех данных - даже в новом metatrader 4 - по крайней мере, я не нашел).
Привет, Младен,
Я задал вопрос о скрипте, который отсекает несколько часов от реального графика. Теперь я хочу установить задержку на каждом баре, чтобы на графике у меня было смещение по времени.
Я попробовал сделать это таким образом, но это не работает (как я думаю).
input int TimeDelay_Minutes = 60;
input int StartHour = 8;
input int StartMinute = 0;
input int CloseHour = 16;
input int CloseMinute = 30;
int InpPeriodMultiplier=1; // Period multiplier factor
int ExtHandle=-1;
//+------------------------------------------------------------------+
//| script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
datetime time0;
ulong last_fpos=0;
long last_volume=0;
int i, start_pos, periodseconds;
int hwnd=0, cnt=0;
//---- History header
int version=401;
string c_copyright;
string c_symbol=Symbol();
int i_period=Period()*InpPeriodMultiplier;
int i_digits=Digits;
int i_unused[13];
MqlRates rate;
//---
ExtHandle=FileOpenHistory(c_symbol+(string)3+".hst", FILE_BIN|FILE_WRITE|FILE_SHARE_READ|FILE_ANSI);
if(ExtHandle<0)
return;
ArrayInitialize(i_unused,0);
//--- write history file header
FileWriteInteger(ExtHandle, version, LONG_VALUE);
FileWriteString(ExtHandle, c_copyright, 64);
FileWriteString(ExtHandle, c_symbol, 12);
FileWriteInteger(ExtHandle, 3, LONG_VALUE);
FileWriteInteger(ExtHandle, i_digits, LONG_VALUE);
FileWriteInteger(ExtHandle, 0, LONG_VALUE); //timesign
FileWriteInteger(ExtHandle, 0, LONG_VALUE); //last_sync
FileWriteArray(ExtHandle, i_unused, 0, 13);
//--- write history file
periodseconds=i_period*60;
start_pos=Bars-1;
rate.open=Open[start_pos];
rate.low=Low[start_pos];
rate.high=High[start_pos];
rate.tick_volume=(long)Volume[start_pos];
rate.spread=0;
rate.real_volume=0;
//--- normalize open time
rate.time=Time[start_pos]/periodseconds;
rate.time*=periodseconds;
for(i=start_pos-1; i>=0; i--)
{
if(IsStopped())
break;
time0=Time- 1 * 60 *TimeDelay_Minutes;
//--- history may be updated
if(i==0)
{
//--- modify index if history was updated
if(RefreshRates())
i=iBarShift(NULL,0,time0);
}
//---
if((time0>=rate.time+periodseconds || i==0)&& MainTime(time0)==true)
{
if(i==0)
{
rate.time=time0/periodseconds; //NEU
rate.tick_volume+=(long)Volume[0];
if(rate.low>Low[0])
rate.low=Low[0];
if(rate.high<High[0])
rate.high=High[0];
rate.close=Close[0];
}
last_fpos=FileTell(ExtHandle);
last_volume=(long)Volume;
FileWriteStruct(ExtHandle,rate);
cnt++;
if(time0>=rate.time+periodseconds)
{
rate.time=time0/periodseconds;
rate.time*=periodseconds;
rate.open=Open;
rate.low=Low;
rate.high=High;
rate.close=Close;
rate.tick_volume=last_volume;
}
}
else if(MainTime(time0)==true)
{
rate.time=time0/periodseconds; //NEU
rate.tick_volume+=(long)Volume;
if(rate.low>Low)
rate.low=Low;
if(rate.high<High)
rate.high=High;
rate.close=Close;
}
}
FileFlush(ExtHandle);
//Print(cnt," record(s) written");
//--- collect incoming ticks
datetime last_time=LocalTime()-5;
while(!IsStopped())
{
datetime cur_time=LocalTime();
//--- check for new rates
if(RefreshRates())
{
time0=Time[0]- 1 * 60 *TimeDelay_Minutes;
FileSeek(ExtHandle,last_fpos,SEEK_SET);
//--- is there current bar?
if(time0<rate.time+periodseconds && MainTime(time0)==true)
{
rate.tick_volume+=(long)Volume[0]-last_volume;
last_volume=(long)Volume[0];
if(rate.low>Low[0])
rate.low=Low[0];
if(rate.high<High[0])
rate.high=High[0];
rate.close=Close[0];
}
else if(MainTime(time0)==true)
{
//--- no, there is new bar
rate.tick_volume+=(long)Volume[1]-last_volume;
if(rate.low>Low[1])
rate.low=Low[1];
if(rate.high<High[1])
rate.high=High[1];
//--- write previous bar remains
FileWriteStruct(ExtHandle,rate);
last_fpos=FileTell(ExtHandle);
//----
rate.time=time0/periodseconds;
rate.time*=periodseconds;
rate.open=Open[0];
rate.low=Low[0];
rate.high=High[0];
rate.close=Close[0];
rate.tick_volume=(long)Volume[0];
last_volume=rate.tick_volume;
}
//----
FileWriteStruct(ExtHandle,rate);
FileFlush(ExtHandle);
//---
if(hwnd==0)
{
hwnd=WindowHandle(Symbol(),i_period);
if(hwnd!=0)
Print(" "); //Chart window detected
}
//--- refresh window not frequently than 1 time in 2 seconds
if(hwnd!=0 && cur_time-last_time>=2)
{
PostMessageA(hwnd,WM_COMMAND,33324,0);
last_time=cur_time;
}
}
Sleep(50);
}
//---
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
if(ExtHandle>=0)
{
FileClose(ExtHandle);
ExtHandle=-1;
}
//---
}
Привет, Младен,
Я задал вопрос о скрипте, который отсекает несколько часов от реального графика. Теперь я хочу установить задержку на каждом баре, чтобы на графике у меня было смещение по времени.
Я попробовал сделать это таким образом, но это не работает (как я думаю).
input int TimeDelay_Minutes = 60;
input int StartHour = 8;
input int StartMinute = 0;
input int CloseHour = 16;
input int CloseMinute = 30;
int InpPeriodMultiplier=1; // Period multiplier factor
int ExtHandle=-1;
//+------------------------------------------------------------------+
//| script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
datetime time0;
ulong last_fpos=0;
long last_volume=0;
int i, start_pos, periodseconds;
int hwnd=0, cnt=0;
//---- History header
int version=401;
string c_copyright;
string c_symbol=Symbol();
int i_period=Period()*InpPeriodMultiplier;
int i_digits=Digits;
int i_unused[13];
MqlRates rate;
//---
ExtHandle=FileOpenHistory(c_symbol+(string)3+".hst", FILE_BIN|FILE_WRITE|FILE_SHARE_READ|FILE_ANSI);
if(ExtHandle<0)
return;
ArrayInitialize(i_unused,0);
//--- write history file header
FileWriteInteger(ExtHandle, version, LONG_VALUE);
FileWriteString(ExtHandle, c_copyright, 64);
FileWriteString(ExtHandle, c_symbol, 12);
FileWriteInteger(ExtHandle, 3, LONG_VALUE);
FileWriteInteger(ExtHandle, i_digits, LONG_VALUE);
FileWriteInteger(ExtHandle, 0, LONG_VALUE); //timesign
FileWriteInteger(ExtHandle, 0, LONG_VALUE); //last_sync
FileWriteArray(ExtHandle, i_unused, 0, 13);
//--- write history file
periodseconds=i_period*60;
start_pos=Bars-1;
rate.open=Open[start_pos];
rate.low=Low[start_pos];
rate.high=High[start_pos];
rate.tick_volume=(long)Volume[start_pos];
rate.spread=0;
rate.real_volume=0;
//--- normalize open time
rate.time=Time[start_pos]/periodseconds;
rate.time*=periodseconds;
for(i=start_pos-1; i>=0; i--)
{
if(IsStopped())
break;
time0=Time- 1 * 60 *TimeDelay_Minutes;
//--- history may be updated
if(i==0)
{
//--- modify index if history was updated
if(RefreshRates())
i=iBarShift(NULL,0,time0);
}
//---
if((time0>=rate.time+periodseconds || i==0)&& MainTime(time0)==true)
{
if(i==0)
{
rate.time=time0/periodseconds; //NEU
rate.tick_volume+=(long)Volume[0];
if(rate.low>Low[0])
rate.low=Low[0];
if(rate.high<High[0])
rate.high=High[0];
rate.close=Close[0];
}
last_fpos=FileTell(ExtHandle);
last_volume=(long)Volume;
FileWriteStruct(ExtHandle,rate);
cnt++;
if(time0>=rate.time+periodseconds)
{
rate.time=time0/periodseconds;
rate.time*=periodseconds;
rate.open=Open;
rate.low=Low;
rate.high=High;
rate.close=Close;
rate.tick_volume=last_volume;
}
}
else if(MainTime(time0)==true)
{
rate.time=time0/periodseconds; //NEU
rate.tick_volume+=(long)Volume;
if(rate.low>Low)
rate.low=Low;
if(rate.high<High)
rate.high=High;
rate.close=Close;
}
}
FileFlush(ExtHandle);
//Print(cnt," record(s) written");
//--- collect incoming ticks
datetime last_time=LocalTime()-5;
while(!IsStopped())
{
datetime cur_time=LocalTime();
//--- check for new rates
if(RefreshRates())
{
time0=Time[0]- 1 * 60 *TimeDelay_Minutes;
FileSeek(ExtHandle,last_fpos,SEEK_SET);
//--- is there current bar?
if(time0<rate.time+periodseconds && MainTime(time0)==true)
{
rate.tick_volume+=(long)Volume[0]-last_volume;
last_volume=(long)Volume[0];
if(rate.low>Low[0])
rate.low=Low[0];
if(rate.high<High[0])
rate.high=High[0];
rate.close=Close[0];
}
else if(MainTime(time0)==true)
{
//--- no, there is new bar
rate.tick_volume+=(long)Volume[1]-last_volume;
if(rate.low>Low[1])
rate.low=Low[1];
if(rate.high<High[1])
rate.high=High[1];
//--- write previous bar remains
FileWriteStruct(ExtHandle,rate);
last_fpos=FileTell(ExtHandle);
//----
rate.time=time0/periodseconds;
rate.time*=periodseconds;
rate.open=Open[0];
rate.low=Low[0];
rate.high=High[0];
rate.close=Close[0];
rate.tick_volume=(long)Volume[0];
last_volume=rate.tick_volume;
}
//----
FileWriteStruct(ExtHandle,rate);
FileFlush(ExtHandle);
//---
if(hwnd==0)
{
hwnd=WindowHandle(Symbol(),i_period);
if(hwnd!=0)
Print(" "); //Chart window detected
}
//--- refresh window not frequently than 1 time in 2 seconds
if(hwnd!=0 && cur_time-last_time>=2)
{
PostMessageA(hwnd,WM_COMMAND,33324,0);
last_time=cur_time;
}
}
Sleep(50);
}
//---
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
if(ExtHandle>=0)
{
FileClose(ExtHandle);
ExtHandle=-1;
}
//---
}
Почему бы вам просто не добавить некоторый временной сдвиг к rate.time перед записью в файл (добавление может быть положительным или отрицательным), а затем, когда вы записали файл в файл, вернуть его исходное значение?
MrWigglesworth Вот версия с добавлением Dema в качестве типа 4: ma__dema_crossover_with_arrow_and_email.mq4
Здравствуйте, господин Младен,
Как вы сегодня? Во вложении график с индикаторами 5 и 12 DEMA...Также на графике находится модифицированный вами индикатор ma+DEMA. Он установлен на 5-ma1 и 12-ma2 и выбрал тип 4 (DEMA) для обеих MA... Как вы можете видеть из стрелок, они, кажется, не совпадают с линиями... Любые мысли о том, что не так? Большое спасибо!
Здравствуйте, г-н MLaden,
Как вы сегодня? Во вложении график с индикаторами 5 и 12 DEMA...Также на графике индикатор ma+DEMA, который вы модифицировали. Он установлен на 5-ma1 и 12-ma2 и выбрал тип 4 (DEMA) для обеих MA... Как вы можете видеть по стрелкам, они, кажется, не совпадают с линиями... Есть мысли о том, что не так? Большое спасибо!
Кстати, вот индикатор DEMA, который я использую, если это поможет.
Здравствуйте господин MLaden,
Как вы сегодня? Во вложении график с индикаторами 5 и 12 DEMA...Также на графике индикатор ma+DEMA, который вы модифицировали. Он установлен на 5-ma1 и 12-ma2 и выбрал тип 4 (DEMA) для обеих MA... Как вы можете видеть по стрелкам, они, кажется, не совпадают с линиями... Есть мысли о том, что не так? Большое спасибо!
Какую дему вы используете для сравнения?
Напоминаю: дема - это не ema из ema, а разница 2 x ema и ema из ema.
Формулу для этого можно найти даже здесь : Двойная экспоненциальная скользящая средняя - Помощь MetaTrader 5
с уважением
Какую дему вы используете для сравнения?
См. сообщение 2631 выше с прикрепленным файлом DEMA.mq4... Это помогает?
Какую дему вы используете для сравнения?
Напоминаю: dema - это не ema из ema, а разность 2 x ema и ema. из ema.
Формулу для этого можно найти даже здесь : Двойная экспоненциальная скользящая средняя - Помощь MetaTrader 5
с уважением,Да, я знаком с DEMA, хотя никогда не запоминал формулу... Вот практическая разница между 5-SMA (красный) и 5-DEMA (зеленый).