Как кодировать? - страница 179

 
Roger09:
Я пробовал несколько раз на аккаунте Alpari, никаких ошибок. Только один раз, когда я поместил скрипт в каталог экспертов и запустил от имени эксперта.

Это потому, что я спросил вас о каталогах.

Извините.

Я думаю, я понял, в чем проблема. У меня windows vista, и я обычно делаю "запуск от имени администратора". Я попробовал без этого и, кажется, теперь все работает нормально.

 

Передача массива из MT4 .mq4 в C++ DLL

Помогите пожалуйста.

У меня проблема с передачей одного массива, содержащего 8 значений индикатора, в C++ DLL. Это очень просто, но я получаю -1 при вызове функции

Forexindex(), которая на самом деле вызывает импортированную функцию gepModel ( d [] ) из DLL. Функция ForexIndex должна возвращать 0 или 1 из DLL.

Я подозреваю, что я делаю что-то неправильно в файле .mq4 в функции Forexindex() . Любая помощь будет высоко оценена. Ниже приведен простой код. DLL файл C++ в порядке, он компилируется без ошибок, так что проблема в mq4 файле.

================================MQ4 file====================

#import "JadeClass.dll"

int gepModel( double& d[] );

#import

int start()

{

........

........

........

ForexIndex();

.......

......

......

.....

}

int ForexIndex()

{

int myindex;

double ind[] , MA_Close, MA_High, MA_Low, MA_Open, Macd, Rsi, Stoch, Vol;

int counted_bars=IndicatorCounted();

if (counted_bars<0) return(-1);

if (counted_bars>0) counted_bars--;

int pos=Bars-counted_bars;

MA_Close = iMA(NULL,PERIOD_M5,8,0,0,0,0,0) ;

MA_High = iMA(NULL,PERIOD_M5,8,0,0,0,0,0) ;

MA_Low = iMA(NULL,PERIOD_M5,8,0,0,0,0,0) ;

MA_Open = iMA(NULL,PERIOD_M5,8,0,0,0,0,0) ;

Macd = iMACD(NULL,PERIOD_M5,12,26,9,0,0,0,0);

Rsi = iRSI(NULL,PERIOD_M5,10,0,0,0);

Stoch = iStochastic(NULL,PERIOD_M5,14,3,3,0,0,0,0);

Vol = iVolume(NULL,PERIOD_M5,0);

while(pos>=0)

{

ind[0] = MA_Close;

ind[1] = MA_High;

ind[2] = MA_Low;

ind[3] = MA_Open;

ind[4] = Macd;

ind[5] = Rsi;

ind[6] = Stoch;

ind[7] = Vol;

myindex = gepModel(ind);

pos--;

}

Print( " Myindex = " , myindex);

return (myindex);

}

=========================DLL Исходный код ===========================

#include "stdafx.h"

#include "JadeClass.h"

#include

#ifdef _DEBUG

#define new DEBUG_NEW

#endif

#define MT4_EXPFUNC __declspec(dllexport)

// Единственный и неповторимый объект CJadeClassApp

CJadeClassApp theApp;

MT4_EXPFUNC int __stdcall gepModel(double d[]);

MT4_EXPFUNC int __stdcall gepModel(double d[])

{

.....

.....

.....

.....

}

============================ Файл Def для исходного кода DLL ===================

; JadeClass.def : Объявляет параметры модуля для DLL.

LIBRARY "JadeClass"

ЭКСПОРТЫ

; Явные экспорты могут находиться здесь

gepModel

========================================

 

Нужна помощь в добавлении кода только для одной сделки на сигнал

Я только изучаю код mq4 и потратил много часов, пытаясь понять, как добавить только одну сделку на сигнал. Я попробовал несколько способов, но не могу заставить его совершать только одну сделку. Например, если TP достигнут, он разместит еще одну сделку в ту же сторону, потому что сигнал все еще хороший. Я бы хотел, чтобы он ждал обратного сигнала, а затем заключал сделку. Я приложил советник без изменений. Заранее спасибо за помощь. Марти

Файлы:
 
martypatty:
Я только изучаю код mq4 и потратил много часов, пытаясь понять, как закодировать только одну сделку на сигнал. Я попробовал несколько способов, но не могу заставить его совершать только одну сделку. Например, если TP достигнут, он разместит еще одну сделку в ту же сторону, потому что сигнал все еще хороший. Я бы хотел, чтобы он ждал обратного сигнала, а затем размещал эту сделку. Я приложил советник без изменений. Заранее спасибо за помощь. Марти

Я узнал, как это делается, недавно на сайте mql4.com после того, как у меня возникли проблемы со слишком большим количеством открытых сделок на одном баре. Статьи на mql4 очень помогли мне в самом начале, плюс у них есть база данных кодов, которая дает вам хорошие примеры для работы. На этом сайте есть отличная история сообщений и несколько действительно хороших кодеров, просто воспользуйтесь поиском и нажмите кнопку "отобразить как сообщения", это сэкономит вам время на просмотре страниц темы в поисках нужного вам ответа. Что касается вашей проблемы, просто используйте этот код:

int BarsCount=0;

if(Bars<BarsCount)

{

//Code to do once goes here

BarsCount=Bars;

}

[/CODE]

Personally I'm having problems with an array. I cant for the life of me figure out why the following code returns 0 all the time... Any help would be much appreciated. I'm trying to create an array of length STD_MA_Period+1 to later use with iMAOnArray but it doesnt work so its back to the drawing board I guess.

[CODE]for(i=0;i<=STD_MA_Period+1;i++)

{

STD_MA_Buffer=iStdDev(Symbol(),Period(),STD_Period,0,MODE_SMA,PRICE_CLOSE,i);

}

Print(STD_MA_Buffer[1]);

PS double STD_MA_Buffer[]; определяется в разделе глобальных переменных.

 

исправьте мой советник, пожалуйста

у меня есть некоторые идеи, но я могу записать их в код mql4, не могли бы вы мне помочь?????

вот моя проблема

вот определение моей системы:

A. если ордера=0 >> OP buy && OP sell

B. создать сетку по условию + или -

например, если OPbuy + grid = OPbuy

если OPbuy - сетка = OPsell

то же самое для OPsell

C. если прибыль > 0 && прибыль > минимальной прибыли (блокировка прибыли)

остановите любой ордер (OP buy || OP sell) и переместите трейлинг эквити или точку прибыли.

D. закрытие по прибыли может быть по эквити или по пункту

E. Формат .mq4, потому что я хочу знать, где моя ошибка.

У меня проблема в точке B. Пожалуйста, помогите мне.

 
mazgen:
У меня есть некоторые идеи, но я могу написать их в mql4 код, вы можете помочь мне?????

это моя проблема

вот определение моей системы:

A. если ордера=0 >> OP buy && OP sell

B. сделать сетку по условию + или -

например, если OPbuy + grid = OPbuy

если OPbuy - сетка = OPsell

то же самое для OPsell

C. если прибыль > 0 && прибыль > минимальной прибыли (блокировка прибыли)

остановите любой ордер (OP buy || OP sell) и переместите трейлинг эквити или точку прибыли.

D. закрытие по прибыли может быть по эквити или по пункту

E. формат .mq4, потому что я хочу знать, где моя ошибка.

У меня проблема с пунктом В. Пожалуйста, помогите мне

Как насчет того, чтобы прислать исходный код вместо ex4?

 
figurelli:
Как насчет того, чтобы отправить исходный код вместо ex4?

просто покажите мне, как это закодировать,

это мое последнее подробное заявление

исправьте это.rar

Я надеюсь, что это может понять мой советник, проблема, что цикл на OP продать почему ????

 

вопрос олинии тренда

Новичок в кодировании и просто делаю вещи для практики, я хотел остановить линию тренда на текущем баре. То, что я придумал, это просто изменить цвет линии на текущем баре на цвет фона. По сути, я просто сливаю линию за баром с фоном и заставляю ее исчезнуть в этой точке.

Поэтому теперь я спрашиваю экспертов, как правильно это сделать. Я знаю, что есть много способов добиться того же самого, поэтому я просто хочу увидеть другие идеи о том, что я мог бы сделать, в попытке узнать больше.

Спасибо

 

Очень странное поведение кода MQL

Привет всем,

Metatrader Version: 4.00 Build 224 (15 мая 2009)

Metaeditor Версия: 4.00 Build 224 (14 мая 2009)

Я столкнулся с очень странной ошибкой в MQL, которая меня полностью озадачила, настолько, что я пересматриваю весь свой старый код, чтобы убедиться, что он написан так, чтобы избежать этой проблемы.

Я надеюсь, что кто-нибудь сможет пролить свет на то, что именно здесь происходит.

Вот код, простой индикатор, который по сути ничего не делает. Однако в разделе init() я разместил вызов двух функций, когда период графика равен H1.

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

#property indicator_chart_window

void afunc() {

int i;

int array[4];

array[0] = 100;

array[1] = 101;

array[2] = 102;

array[3] = 103;

Print("afunc array[4] size="+ArraySize(array));

for (i = 0; i < 4; i++) {

Print("afunc array["+i+"]="+array);

}

}

void afunc_static() {

int i;

static int array[4];

array[0] = 100;

array[1] = 101;

array[2] = 102;

array[3] = 103;

Print("afunc_static array[4] size="+ArraySize(array));

for (i = 0; i < 4; i++) {

Print("afunc_static array["+i+"]="+array);

}

}

int init() {

if (Period() == PERIOD_H1) {

afunc();

afunc_static();

}

return(0);

}

int deinit() {

return(0);

}

int start() {

return(0);

}

Если посмотреть на код, то не должно быть никаких обстоятельств, при которых эти две функции вели бы себя по-разному.

Однако, если я прикреплю индикатор к графику M5, а затем переключусь на таймфрейм H1, то получу следующий результат.

2009.05.23 18:12:47 afunc EURUSD,H1: initialized

2009.05.23 18:12:47 afunc EURUSD,H1: afunc_static array[3]=103

2009.05.23 18:12:47 afunc EURUSD,H1: afunc_static array[2]=102

2009.05.23 18:12:47 afunc EURUSD,H1: afunc_static array[1]=101

2009.05.23 18:12:47 afunc EURUSD,H1: afunc_static array[0]=100

2009.05.23 18:12:47 afunc EURUSD,H1: afunc_static array[4] size=4

2009.05.23 18:12:47 afunc EURUSD,H1: afunc массив[3]=0

2009.05.23 18:12:47 afunc EURUSD,H1: afunc array[2]=0

2009.05.23 18:12:47 afunc EURUSD,H1: afunc array[1]=0

2009.05.23 18:12:47 afunc EURUSD,H1: afunc array[0]=0

2009.05.23 18:12:47 afunc EURUSD,H1: afunc array[4] size=0

2009.05.23 18:12:47 afunc EURUSD,M5: uninit reason 3

2009.05.23 18:12:47 afunc EURUSD,M5: деинициализация

2009.05.23 18:12:45 afunc EURUSD,M5: инициализирована

2009.05.23 18:12:43 afunc EURUSD,M5: успешно загружен

Обратите внимание, что, несмотря на то, что я определил 'int array[4]' в afunc(), размер этого массива фактически равен НУЛЮ, и я не могу присвоить значения элементам массива. Очевидно, что эта функция работает не так, как ожидалось.

Обратите внимание, что я определил 'static int array[4]' в afunc_static() и размер правильно отображается как 4, как и значения, которые я присвоил элементам массива. Эта функция работает нормально.

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

Если вы впоследствии переключите таймфрейм графика, а затем вызовете функцию, то размер любых локально определенных массивов в функции будет равен нулю, независимо от того, какой размер массивов вы определили.

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

Я буду очень признателен за любые отзывы по этому вопросу.

С уважением,

Лоранс.

Файлы:
afunc.mq4  1 kb
 
Причина обращения: