Скачать MetaTrader 5

Помогите, пожалуйста, разобраться с DLL

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Опубликуй торговый сигнал. Получи доступ к миллионам трейдеров!
Андрей
18
Андрей 2013.09.25 23:41 

Написал индикатор, хочу, чтобы он работал только на моем счете. Для этого использовал DLL, хотя никогда их не писал.

Текст библиотеки:

#include "stdafx.h"

BOOL APIENTRY DllMain( HMODULE hModule,

DWORD ul_reason_for_call,

LPVOID lpReserved

)

{

switch (ul_reason_for_call)

{

case DLL_PROCESS_ATTACH:

case DLL_THREAD_ATTACH:

case DLL_THREAD_DETACH:

case DLL_PROCESS_DETACH:

break;

}

return TRUE;

}

#define MT4DLL extern "C" __declspec(dllexport)


MT4DLL int __stdcall Calc(double close, double close1, double ma, double par1, double par2, int stoh1, int stoh2, int accnum)

{

if(close>ma && close>par1 && close1<par2 && stoh1==25 && accnum==3576835) return 1;

if(close<ma && close<par1 && close1>par2 && stoh2==75 && accnum==3576835) return 2;

else return 0;

}

Компилируется без ошибок.

Текст индикатора

double val1[];

double val2[];

#import "Win32Project1.dll"

int Calc(double close, double close1, double ma, double par1, double par2, int stoh1, int stoh2, int accnum);//Импорт функции из библиотеки

#import

int init()

{

IndicatorBuffers(2);

SetIndexStyle(0,DRAW_ARROW);

SetIndexArrow(0,234);

SetIndexStyle(1,DRAW_ARROW);

SetIndexArrow(1,233);

SetIndexBuffer(0,val1);

SetIndexBuffer(1,val2);

//---- indicators

//----

return(0);

}

//+------------------------------------------------------------------+

//| Custom indicator deinitialization function |

//+------------------------------------------------------------------+

int deinit()

{

//----

Comment("");

//----

return(0);

}

//+------------------------------------------------------------------+

//| Custom indicator iteration function |

//+------------------------------------------------------------------+


int start()

{

//----

int counted_bars=IndicatorCounted();

for(int i=Bars-counted_bars-1;i>0;i--)

{

if (Time[i]>=StrToTime(StringConcatenate(TimeToStr(Time[i],TIME_DATE)," ",Start)) &&

Time[i]< StrToTime(StringConcatenate(TimeToStr(Time[i],TIME_DATE)," ",End)))

{

double ma=iCustom(NULL,0,"i-DEMA",100,0,i);

double par1=iCustom(NULL,0,"Parabolic_r2",0.02,0.2,0,i);

double par2=iCustom(NULL,0,"Parabolic_r2",0.02,0.2,0,i+1);

int stoh1=iCustom(NULL,0,"i-StochConfirm",12,12,2,3,0,0,75,-1,2,i);

int stoh2=iCustom(NULL,0,"i-StochConfirm",12,12,2,3,0,0,75,-1,1,i);

if(Calc(Close[i],Close[i+1],ma,par1,par2,stoh1,stoh2,AccountNumber())==1) val2[i]=Low[i];//Вызов функции и передача параметров

if(Calc(Close[i],Close[i+1],ma,par1,par2,stoh1,stoh2,AccountNumber())==2) val1[i]=High[i];//

else return;

}

}

//----

return(0);

Все тоже компилируется без ошибок, но на графике ничего нет, хотя не ругается на невозможность вызова внешней функции Calc. Знаю, что проверку номера счета можно сделать непосредственно в самом индикаторе, но его можно очень просто декомпилировать, поэтому решил сделать через библиотеку.

В чем я ошибся?

Vadim Zhunko
5226
Vadim Zhunko 2013.09.26 00:20  

Для начала надо научиться код вставлять через кнопку SRC.

Потом надо проверить наличие DEF-файла и правильной записи в нём экспортируемой функции.

Андрей
18
Андрей 2013.09.26 13:32  
Zhunko:

Для начала надо научиться код вставлять через кнопку SRC.

Потом надо проверить наличие DEF-файла и правильной записи в нём экспортируемой функции.


Про кнопку учту. В DEf-файле все описано правильно, при вызове функции из индикатора нет никаких ошибок. Такое ощущение, что в нее просто не передаются аргументы.
Sergey Dzyublik
4817
Sergey Dzyublik 2013.09.26 13:57  
        switch (ul_reason_for_call)
        {
         case DLL_PROCESS_ATTACH:
         case DLL_THREAD_ATTACH:
         case DLL_THREAD_DETACH:
         case DLL_PROCESS_DETACH: break;
        }
        return TRUE;

я новечок, но в выложеном Вами коде непонятен стиль писания вцелом.

Вы уверены что switch делает вообще что-то? https://book.mql4.com/ru/operators/switch

как по мне вся функция просто возвращает TRUE.

Андрей
18
Андрей 2013.09.26 14:05  
ALXIMIKS:

я новечок, но в выложеном Вами коде непонятен стиль писания вцелом.

Вы уверены что switch делает вообще что-то? https://book.mql4.com/ru/operators/switch

как по мне вся функция просто возвращает TRUE.


Эту функцию автоматом вставил VC 2010 при создании DLL. Решил не трогать, так как сам пока не разбираюсь:)
Vadim Zhunko
5226
Vadim Zhunko 2013.09.26 15:16  
radzik:

Про кнопку учту.

Что-то не заметил... Это не формальность. Это уважение к тем, у кого просите помощь.

ALXIMIKS:

я новечок, но в выложеном Вами коде непонятен стиль писания вцелом.

Вы уверены что switch делает вообще что-то? https://book.mql4.com/ru/operators/switch

как по мне вся функция просто возвращает TRUE.

Тут всё в порядке. Так должно быть.

Sergey Dzyublik
4817
Sergey Dzyublik 2013.09.26 15:31  
Zhunko:

Тут всё в порядке. Так должно быть.


а тут может?

MT4DLL int __stdcall Calc(double close, double close1, double ma, double par1, double par2, int stoh1, int stoh2, int accnum)
{
        if(close>ma && close>par1 && close1<par2 && stoh1==25 && accnum==3576835) return 1;
        if(close<ma && close<par1 && close1>par2 && stoh2==75 && accnum==3576835) return 2;
        else return 0;
}

1) идет жесткая привязка к stoh1 и stoh2, но учтено ли округление к такой точности ???

2) else return 0 относится только к второму if(close<ma && .............

может правильнее оставить просто return 0

220Volt
1175
220Volt 2013.09.26 16:24  
Убирите из описания функции __stdcall, если заработает, то проблемы с def файлом (возможно не прицеплен к проекту).
Vadim Zhunko
5226
Vadim Zhunko 2013.09.26 16:50  
220Volt:
Убирите из описания функции __stdcall, если заработает, то проблемы с def файлом (возможно не прицеплен к проекту).

Так должно быть:

__declspec(dllexport) type __stdcall Func(){}
220Volt
1175
220Volt 2013.09.26 16:56  
У меня нет желания спорить, поделился соображениями по вопросу.
Vadim Zhunko
5226
Vadim Zhunko 2013.09.26 17:25  
ALXIMIKS:


а тут может?

1) идет жесткая привязка к stoh1 и stoh2, но учтено ли округление к такой точности ???

2) else return 0 относится только к второму if(close<ma && .............

может правильнее оставить просто return 0

1. Да. Надо правильно сравнивать с учётом требуемой точности. У него это не обеспечено.

2. Это тоже что:

MT4DLL int __stdcall Calc(double close, double close1, double ma, double par1, double par2, int stoh1, int stoh2, int accnum)
 {
  if(close>ma && close>par1 && close1<par2 && stoh1==25 && accnum==3576835) return 1;
  if(close<ma && close<par1 && close1>par2 && stoh2==75 && accnum==3576835) return 2;
  return 0;
 }
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий