Access Violation при установке индикатора

Образцы, куски исходников, вопросы. Обсуждаем программирование.
Ответить
Сообщение
Автор
joomba
Сообщения: 12
Зарегистрирован: Пт мар 21, 2014 12:35 pm

Access Violation при установке индикатора

#1 Сообщение joomba » Пн мар 24, 2014 12:15 pm

Написал простой индикатор
RoundLevels.cpp

Код: Выделить всё

#include <windows.h>
#include <math.h>
#include "IndicatorInterfaceUnit.h"

int vLineColor = 0x00FFFF;
int vLineStyle = 0;
double dXPoint = 1;
double Div = 0;

EXPORT void __stdcall Init()
{
	IndicatorShortName("RoundLevels");
	SetOutputWindow(ow_ChartWindow);

	RegOption("vLineColor", ot_Color, &vLineColor);
	RegOption("vLineStyle", ot_LineStyle, &vLineStyle);

	if(Digits() == 5 || Digits() == 3) dXPoint = 10;
   
	Div = 0.1 / (Point() * dXPoint);
}

EXPORT void __stdcall OnParamsChange()
{

}

EXPORT void __stdcall Calculate(int index)
{

}
RoundLevels.def

Код: Выделить всё

LIBRARY ROUNDLEVELS

EXPORTS Init
	Calculate
	ReplaceStr
	IntrfProcsRec
	OnParamsChange
Компилируется без ошибок, но при установке выдает
Изображение

joomba
Сообщения: 12
Зарегистрирован: Пт мар 21, 2014 12:35 pm

Re: Access Violation при установке индикатора

#2 Сообщение joomba » Вт мар 25, 2014 6:55 am

Ошибка из-за этих строк кода

Код: Выделить всё

   if(Digits() == 5 || Digits() == 3) dXPoint = 10;
   
   Div = 0.1 / (Point() * dXPoint);
В индикаторах нельзя записывать в глобальные переменные?

joomba
Сообщения: 12
Зарегистрирован: Пт мар 21, 2014 12:35 pm

Re: Access Violation при установке индикатора

#3 Сообщение joomba » Вт мар 25, 2014 7:18 am

Похоже все дело в функциях Digits и Point. Их что нельзя использовать в Init?

joomba
Сообщения: 12
Зарегистрирован: Пт мар 21, 2014 12:35 pm

Re: Access Violation при установке индикатора

#4 Сообщение joomba » Ср мар 26, 2014 5:38 am

КАК ИЗВЛЕЧЬ ИЗ ПАРАМЕТРА ot_LineStyle ЗНАЧЕНИЯ TPenStyle, width, TColor???

Аватара пользователя
neHcioHep
Сообщения: 4
Зарегистрирован: Пт ноя 20, 2009 9:24 pm
Контактная информация:

Re: Access Violation при установке индикатора

#5 Сообщение neHcioHep » Ср мар 26, 2014 11:54 am

joomba писал(а):КАК ИЗВЛЕЧЬ ИЗ ПАРАМЕТРА ot_LineStyle ЗНАЧЕНИЯ TPenStyle, width, TColor???
В примерах есть индикатор ADR_mod01 написанный на делфи
там делается следующим образом

Код: Выделить всё

type
  //----------------------------------
  // line style
  //----------------------------------
  PLineStyleRec = ^TLineStyleRec;
  TLineStyleRec = packed record
    LineColor: TColor;
    LineStyle: TPenStyle;
    LineWidth: integer;
  end;
  ...

var
  Line1, Line2: TLineStyleRec;

  ...

//---------------------------------------------------------------------------
// Initialize indicator
//---------------------------------------------------------------------------
procedure Init; stdcall;
begin

  ...

  RegOption('Line1', ot_LineStyle, Line1);
  Line1.LineStyle := TPenStyle(ps_Dot);
  Line1.LineColor := RGB(255, 165, 0);
  Line1.LineWidth := 1;

  RegOption('Line2', ot_LineStyle, Line2);
  Line2.LineStyle := TPenStyle(ps_Solid);
  Line2.LineColor := clRed;
  Line2.LineWidth := 2;
end;
попробуй создать структуру Линия и в RegOption передать указатель на структуру

joomba
Сообщения: 12
Зарегистрирован: Пт мар 21, 2014 12:35 pm

Re: Access Violation при установке индикатора

#6 Сообщение joomba » Ср мар 26, 2014 12:43 pm

попробуй создать структуру Линия и в RegOption передать указатель на структуру
Работает, только width не устанавливается

Код: Выделить всё

#include <windows.h>
#include "IndicatorInterfaceUnit.h"

typedef struct {
	TColor color;
	TPenStyle style;
	int width;
} TLineStyle, *PLineStyle;

TLineStyle vLineStyle;

EXPORT void __stdcall Init()
{
	...
	RegOption("vLineStyle", ot_LineStyle, &vLineStyle);
}

EXPORT void __stdcall Calculate(int index)
{
			...
			ObjectSet(name, OBJPROP_STYLE, vLineStyle.style);
			ObjectSet(name, OBJPROP_COLOR, vLineStyle.color);
			ObjectSet(name, OBJPROP_WIDTH, vLineStyle.width);
			...
}

joomba
Сообщения: 12
Зарегистрирован: Пт мар 21, 2014 12:35 pm

Re: Access Violation при установке индикатора

#7 Сообщение joomba » Чт мар 27, 2014 12:50 pm

У меня вопрос к разработчикам!!!
Планируете ли вы встроить в ForexTester какой-нибудь скриптовый язык (типа Lua, Pawn, Pike, AngelScript, Squirrel или даже mql4)??? А то писать dll неудобно, много багов и всё тормозит

FX Helper
Сообщения: 566
Зарегистрирован: Пн апр 01, 2013 11:44 am

Re: Access Violation при установке индикатора

#8 Сообщение FX Helper » Пт мар 28, 2014 8:20 am

Здравствуйте,

На данный момент в программе Форекс Тестер присутствует поддержка языков Delphi и C++. На данный момент, поддержка других языков не планируется.

Аватара пользователя
Terranin
Site Admin
Сообщения: 846
Зарегистрирован: Вс июл 23, 2006 12:01 pm

Re: Access Violation при установке индикатора

#9 Сообщение Terranin » Пт апр 04, 2014 3:19 pm

joomba писал(а):Похоже все дело в функциях Digits и Point. Их что нельзя использовать в Init?
Многие функции нельзя использовать в Init, поскольку они не имеют там смысла. Init предназначен только для инициализации параметров и глобальных переменных. Во время вызова Init индикатор еще не привязан к валюте и таймфрейму, поэтому Digits и Point ничего не могут возвратить.
Asta la vista
Mike

Аватара пользователя
Terranin
Site Admin
Сообщения: 846
Зарегистрирован: Вс июл 23, 2006 12:01 pm

Re: Access Violation при установке индикатора

#10 Сообщение Terranin » Пт апр 04, 2014 3:21 pm

joomba писал(а):
попробуй создать структуру Линия и в RegOption передать указатель на структуру
Работает, только width не устанавливается

Код: Выделить всё

#include <windows.h>
#include "IndicatorInterfaceUnit.h"

typedef struct {
	TColor color;
	TPenStyle style;
	int width;
} TLineStyle, *PLineStyle;

TLineStyle vLineStyle;

EXPORT void __stdcall Init()
{
	...
	RegOption("vLineStyle", ot_LineStyle, &vLineStyle);
}

EXPORT void __stdcall Calculate(int index)
{
			...
			ObjectSet(name, OBJPROP_STYLE, vLineStyle.style);
			ObjectSet(name, OBJPROP_COLOR, vLineStyle.color);
			ObjectSet(name, OBJPROP_WIDTH, vLineStyle.width);
			...
}
Ширина работает только если стиль линии ps_solid.
Asta la vista
Mike

Ответить