← К каталогу
Исходный код · ID 1249

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 и перейдите к оплате.

Стоимость полного кода
679,80₽ ≈ $8.31