renkorangebarsv1.2 new format.mq5
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «renkorangebarsv1.2 new format.mq5» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Это MQL4-индикатор для MetaTrader 4, который строит Renko-диапазонные бары и отображает их как офлайн-график. Он обрабатывает исторические данные цен, формирует файл истории .hst и обновляет график в реальном времени на каждом тике. Индикатор записывает данные баров в файл истории и может инициировать обновление окна графика через системные сообщения. Поддерживается настраиваемый размер кирпича и смещение, опциональное отображение теней, эмуляция поведения онлайн-графика, а также обработка нестандартных имён символов для различных брокеров. Индикатор работает на выбранном офлайн-таймфрейме и учитывает разное количество знаков после запятой, включая пары JPY и котировки брокеров с 5- или 6-значными ценами.
Настройки программы
| Настройка | Описание |
|---|---|
| CandleSize | Размер кирпича — Целочисленный размер кирпича в пунктах, определяющий минимальное ценовое движение для формирования нового бара. |
| Offset | Смещение — Целочисленное начальное смещение базовой линии расчёта кирпичей. |
| What time frame to use for the offline renko chart (TimeFrame) | Таймфрейм — Таймфрейм для офлайн-графика Renko, на котором отображаются построенные бары. |
| ShowWicks | Показывать тени — Переключатель, определяющий, отображать ли максимальные и минимальные значения внутри кирпича в виде теней. |
| EmulateOnLineChart | Эмуляция онлайн-графика — Переключатель, включающий имитацию обновления онлайн-графика через системные сообщения окна. |
| StrangeSymbolName | Нестандартное имя символа — Переключатель для обработки имён символов, которые могут вызывать проблемы у некоторых брокеров. |
Поиск по коду файла
#property indicator_chart_window
#include <WinUser32.mqh>
#include <stdlib.mqh>
#import "user32.dll"
int RegisterWindowMessageA(string lpString);
#import
extern int CandleSize = 50;
extern int Offset = 0;
extern int TimeFrame = 2; // What time frame to use for the offline renko chart
extern bool ShowWicks = false;
extern bool EmulateOnLineChart = true;
extern bool StrangeSymbolName = false;
int HstHandle = -1, LastFPos = 0, MT4InternalMsg = 0;
string SymbolName;
#import "user32.dll"
int GetParent(int hWnd);
int GetWindow(int hWnd,int uCmd);
int RegisterWindowMessageW(string lpString);
int GetWindowTextW(int hWnd,string lpString,int nMaxCount);
int PostMessageW(int hWnd,int Msg,int wParam,int lParam);
#import
void UpdateChartWindow() {
static int hwnd = 0;
if(hwnd == 0) {
hwnd = WindowHandle(SymbolName, TimeFrame);
if(hwnd != 0) Print("Chart window detected");
}
if(EmulateOnLineChart && MT4InternalMsg == 0)
MT4InternalMsg = RegisterWindowMessageW("MetaTrader4_Internal_Message");
if(hwnd != 0) if(PostMessageW(hwnd, WM_COMMAND, 0x822c, 0) == 0) hwnd = 0;
if(hwnd != 0 && MT4InternalMsg != 0) PostMessageW(hwnd, MT4InternalMsg, 2, 1);
return;
}
int start() {
// код доступен только после оплаты
}
static double BoxPoints, UpWick, DnWick;
static double PrevLow, PrevHigh, PrevOpen, PrevClose, CurVolume, CurLow, CurHigh, CurOpen, CurClose;
static datetime PrevTime;
MqlRates rates;
if(HstHandle < 0) {
if(!IsConnected()) {
Print("Waiting for connection...");
return(0);
}
if(!IsDllsAllowed()) {
Print("Error: Dll calls must be allowed!");
return(-1);
}
if(MathAbs(Offset) >= CandleSize) {
Print("Error: |Offset| should be less then CandleSize!");
return(-1);
}
switch(TimeFrame) {
case 1: case 5: case 15: case 30: case 60: case 240:
case 1440: case 10080: case 43200: case 0:
Print("Error: Invald time frame used for offline renko chart (TimeFrame)!");
return(-1);
}
int BoxSize = CandleSize;
int BoxOffset = Offset;
if(Digits == 5 || (Digits == 3 && StringFind(Symbol(), "JPY") != -1)) {
BoxSize = BoxSize*10;
BoxOffset = BoxOffset*10;
}
if(Digits == 6 || (Digits == 4 && StringFind(Symbol(), "JPY") != -1)) {
BoxSize = BoxSize*100;
BoxOffset = BoxOffset*100;
}
if(StrangeSymbolName) SymbolName = StringSubstr(Symbol(), 0, 6);
else SymbolName = Symbol();
BoxPoints = NormalizeDouble(BoxSize*Point, Digits);
PrevLow = NormalizeDouble(BoxOffset*Point + MathFloor(Close[Bars-1]/BoxPoints)*BoxPoints, Digits);
DnWick = PrevLow;
PrevHigh = PrevLow + BoxPoints;
UpWick = PrevHigh;
PrevOpen = PrevLow;
PrevClose = PrevHigh;
CurVolume = 1;
PrevTime = Time[Bars-1];
HstHandle = FileOpenHistory(SymbolName + (string)TimeFrame + ".hst", FILE_BIN|FILE_WRITE|FILE_ANSI);
FileClose(HstHandle); HstHandle = -1;
HstHandle = FileOpenHistory(SymbolName + (string)TimeFrame + ".hst", FILE_BIN|FILE_READ|FILE_WRITE|FILE_SHARE_WRITE|FILE_SHARE_READ|FILE_ANSI);
if(HstHandle < 0) {
Print("Error: can\'t create / open history file: " + ErrorDescription(GetLastError()) + ": " + SymbolName + TimeFrame + ".hst");
return(-1);
}
int HstUnused[13];
FileWriteInteger(HstHandle, 401, LONG_VALUE); // Version
FileWriteString(HstHandle, "", 64); // Copyright
FileWriteString(HstHandle, SymbolName, 12); // Symbol
FileWriteInteger(HstHandle, TimeFrame, LONG_VALUE); // Period
FileWriteInteger(HstHandle, Digits, LONG_VALUE); // Digits
FileWriteInteger(HstHandle, 0, LONG_VALUE); // Time Sign
FileWriteInteger(HstHandle, 0, LONG_VALUE); // Last Sync
FileWriteArray(HstHandle, HstUnused, 0, 13); // Unused
int i = Bars-2;
while(i >= 0) {
CurVolume = CurVolume + Volume[i];
UpWick = MathMax(UpWick, High[i]);
DnWick = MathMin(DnWick, Low[i]);
while((Low[i] < PrevClose-BoxPoints || CompareDoubles(Low[i], PrevClose-BoxPoints))) {
PrevHigh = PrevClose;
PrevLow = PrevClose - BoxPoints;
PrevOpen = PrevHigh;
PrevClose = PrevClose - BoxPoints;
rates.time = PrevTime;
rates.open = PrevOpen;
rates.low = PrevLow;
if(ShowWicks && UpWick > PrevHigh)
rates.high = UpWick;
else rates.high = PrevHigh;
rates.close = PrevClose;
rates.real_volume = (long)CurVolume;
rates.tick_volume = (long)CurVolume;
FileWriteStruct(HstHandle,rates);
UpWick = 0;
DnWick = EMPTY_VALUE;
CurVolume = 0;
CurHigh = PrevLow;
CurLow = PrevLow;
if(PrevTime < Time[i]Показано первые 50% кода (символов: 6798)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.