Для начала надо научиться код вставлять через кнопку SRC.
Потом надо проверить наличие DEF-файла и правильной записи в нём экспортируемой функции.
Для начала надо научиться код вставлять через кнопку SRC.
Потом надо проверить наличие DEF-файла и правильной записи в нём экспортируемой функции.
Про кнопку учту. В DEf-файле все описано правильно, при вызове функции из индикатора нет никаких ошибок. Такое ощущение, что в нее просто не передаются аргументы.
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.
я новечок, но в выложеном Вами коде непонятен стиль писания вцелом.
Вы уверены что switch делает вообще что-то? https://book.mql4.com/ru/operators/switch
как по мне вся функция просто возвращает TRUE.
Эту функцию автоматом вставил VC 2010 при создании DLL. Решил не трогать, так как сам пока не разбираюсь:)
Про кнопку учту.
Что-то не заметил... Это не формальность. Это уважение к тем, у кого просите помощь.
я новечок, но в выложеном Вами коде непонятен стиль писания вцелом.
Вы уверены что switch делает вообще что-то? https://book.mql4.com/ru/operators/switch
как по мне вся функция просто возвращает TRUE.
Тут всё в порядке. Так должно быть.
а тут может?
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
Убирите из описания функции __stdcall, если заработает, то проблемы с def файлом (возможно не прицеплен к проекту).
Так должно быть:
__declspec(dllexport) type __stdcall Func(){}
а тут может?
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; }
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Написал индикатор, хочу, чтобы он работал только на моем счете. Для этого использовал 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. Знаю, что проверку номера счета можно сделать непосредственно в самом индикаторе, но его можно очень просто декомпилировать, поэтому решил сделать через библиотеку.
В чем я ошибся?