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

 

Нужна помощь с функцией iCustom для этого советника можно вызвать пользовательский индикатор.

Привет всем,

Я хотел бы добавить этот (Entry.mq4) инди в этот (swb grid 4.1.0.3_EA) советник с

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

Советник уже использует 3 индикатора MT4 Bollinger Bands, Stochastic и RSI и имеет

переключатели, так что вы можете выбрать любой из них или все они будут использоваться, выбрав TRUE или FALSE.

и я хотел бы добавить этот 4-й индикатор (Entry.mq4) к советнику.

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

спасибо.

советник и инди прикреплены ниже.

Файлы:
 

Нужна помощь новичку в MQL4, чтобы понять этот массив

Привет, кодеры

Не мог бы кто-нибудь просветить меня по массивам немного.

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

int i=Bars;

#property copyright "Unfinished POS by Agent86"

double v1[];

double v2[];

double val1;

double val2;

int start()

{

while(i>=0)

{

val1=iFractals(NULL, 0, MODE_UPPER,i);

if (val1 > 0)

{

v1=High;

}

else

{

v1=v1;

}

val2=iFractals(NULL, 0, MODE_LOWER,i);

if (val2 > 0)

{

v2=Low;

}

else v2=v2;

i--;

}

return(0);

}

Это базовый фрактал, но я не могу сослаться ни на один элемент массива.

Я хочу иметь возможность как-то увеличивать i++ и Print (v1); или печатать предыдущее значение перед 0 или EMPTY_VALUE.

Если я вообще иду в правильном направлении с этим.

У меня проблемы.

Print (v1): всегда == 0 и печатает 0.

Я вроде как понимаю, потому что на самом деле цикл доходит до -1, что == 0.

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

Я пробовал множество методов и повторно инициализировал i=0, чтобы попытаться чередовать цикл, чтобы я мог ссылаться на элементы v1, но все попытки провалились.

В основном я хочу просмотреть предыдущие фракталы или отметить их как A high, B low и т.д. для возможного будущего использования в ABCD схеме типа советника.

На данный момент, в основном, я хочу распечатать v1, чтобы я мог видеть, что он делает.

Возможно, я мог бы разработать что-то для выбора предыдущего фрактала, например, A_high и/или B_low или какую-то подобную схему.

Может быть, я иду по неверному пути?

Пожалуйста, посоветуйте.

Спасибо

 

Я бы выбрал цикл FOR. Циклы While могут привести к блокировке, если вы забудете включить i--. Поскольку вы знаете точное количество баров, его проще использовать, к тому же i никогда не будет < 0. Это поможет избежать путаницы.

For (int i=Bars-1;i>0;i--) {

// код

}

Попробуйте установить все значения массива в 0, затем вернитесь назад и присвойте значения индикаторам. Также попробуйте выполнить print() непосредственно после присвоения значения индикатора. Посмотрите, возвращает ли она вообще что-нибудь.

По моему мнению, лучше всего присвоить массиву размер. Скажем, 1000 позиций. Вряд ли вам понадобится так много, к тому же это сократит количество выполняемых вами вычислений. Все, что вам нужно сделать, это просмотреть последние 999 баров до 0 и присвоить значения. Я припоминаю, что у MT4 есть проблемы с инициализацией массивов и тому подобное.

 

Вопросы по массивам

Trader5050-Deployed:
Я бы выбрал цикл FOR. Циклы While могут привести к блокировке, если вы забудете включить i--. Поскольку вы знаете точное количество баров, его проще использовать, плюс i никогда не будет < 0. Это поможет избежать путаницы.

For (int i=Bars-1;i>0;i--) {

// код

}

Попробуйте установить все значения массива в 0, а затем вернуться назад и присвоить значения индикаторов. Также попробуйте выполнить print() непосредственно после присвоения значения индикатора. Посмотрите, возвращает ли она вообще что-нибудь.

Лучше всего, на мой взгляд, задать размер массива. Скажем, 1000 позиций. Вряд ли вам понадобится столько, к тому же это уменьшит количество вычислений, которые вы делаете. Все, что вам нужно сделать, это просмотреть последние 999 баров до 0 и присвоить значения. Я припоминаю, что у MT4 есть проблемы с инициализацией массивов и тому подобное.

Хорошо, спасибо, я попробую.

Хотя операторы while работают хорошо, это не помогает мне получить элементы массива, которые я хочу распечатать / просмотреть и т.д.

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

Спасибо

 
Trader5050-Deployed:
Я бы выбрал цикл FOR. Циклы While могут привести к блокировке, если вы забудете включить i--. Поскольку вы знаете точное количество баров, его проще использовать, плюс i никогда не будет < 0. Это поможет избежать путаницы.

For (int i=Bars-1;i>0;i--) {

// код

}

Попробуйте установить все значения массива в 0, а затем вернуться назад и присвоить значения индикатора. Также попробуйте выполнить print() непосредственно после присвоения значения индикатора. Посмотрите, возвращает ли она вообще что-нибудь.

Лучше всего, на мой взгляд, задать размер массива. Скажем, 1000 позиций. Вам вряд ли понадобится столько, к тому же это сократит количество вычислений, которые вы делаете. Все, что вам нужно сделать, это просмотреть последние 999 баров до 0 и присвоить значения. Я припоминаю, что у MT4 есть проблемы с инициализацией массивов и тому подобное.

По-прежнему просто печатается массив со всеми 0-ми значениями.

Странно

 

Argent86,

В вашем коде есть пара ошибок:

- массивы, которые вы используете, еще не массивы (если вы не указали размер массива, как вы сделали в коде, то это динамический массив и размер массива должен управляться во время выполнения), поэтому у вас есть массивы размером 0 (это первая причина, почему всегда 0 - это рутина обработки ошибок metatrader, предотвращающая фатальную ошибку и возвращающая 0 в качестве результата для таких случаев - в C/C++ это привело бы к краху).

- если вы не указали, что массив является "series like" (в "series like" 0-й элемент является последним, тогда как в обычных массивах 0-й элемент является первым), поэтому выражение i+1 является следующим элементом массива в этом случае, а не предыдущим. Вы можете использовать массивы в режиме "series like", но тогда вам придется сделать еще пару вещей, чтобы заставить их работать во время выполнения, и даже тогда при изменении номеров столбцов вы получите ползучий код, поэтому лучше использовать массивы в их родном режиме - "C like".

- также убедитесь, что вы начинаете хотя бы с 3-го бара на новом тике (именно там будет появляться новый фрактал, а не на текущем баре).


Вот что вы пытаетесь сделать без этих ошибок
#property indicator_chart_window

double v1[];

double v2[];

int start()

{

int i,a,limit,counted_bars=IndicatorCounted();

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

if(counted_bars>0) counted_bars--;

limit = MathMin(Bars-counted_bars,Bars-1);

if (ArraySize(v1)!=Bars) ArrayResize(v1,Bars);

if (ArraySize(v2)!=Bars) ArrayResize(v2,Bars);

//

//

//

//

//

for (i=limit, a=Bars-i-1; i>=0; i--,a++)

{

v1[a]=v1[a-1]; if (iFractals(NULL,0,MODE_UPPER,i) > 0) v1[a]=High;

v2[a]=v2[a-1]; if (iFractals(NULL,0,MODE_LOWER,i) > 0) v2[a]=Low;

}

Comment("current upper frctal : "+DoubleToStr(v1,Digits)+"\n"+

"current lower frctal : "+DoubleToStr(v2,Digits));

return(0);

}
 

Доступ из MQ4 к функции dll с: списками переменных-аргументов

привет,

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

например, vprintf - C++ Reference

int vprintf ( const char * format, va_list arg );

если да, то как это сделать?

Спасибо

MJ

 

Как вызвать функцию без возвращаемого значения

Здравствуйте, ребята и девчата.

В какой-то момент в моей программе я хочу вызвать функцию.

Однако функция не имеет возвращаемого значения (void). Как же мне вызвать функцию,

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

как если бы он был написан на этом месте?

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

Надеюсь, кто-нибудь сможет помочь мне с этим, заранее спасибо, Jonkie76

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

//| экспертная функция запуска |

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

int start()

{

//----

if (Price >= PRICE_CLOSE)

call function ; //В данный момент я хочу вызвать функцию.Как это сделать?

else

Alert("Ничего не делать"); //

//----

return(0);

}

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

//===================================================================+

//ФУНКЦИИ

//===================================================================+

//----------------------- ФУНКЦИЯ ЗАКРЫТИЯ ОРДЕРА ----------------------+

void subCloseOrder()

{

int

i,

total = 0,

билет = 0,

ошибка = 0,

c = 0;

total = OrdersTotal();

for(i=total-1;i>=0;i--)

{

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

if(OrderSymbol()==Symbol() &&

OrderMagicNumber()==Magic)

{

switch(OrderType())

{

case OP_BUY :

for(c=0;c<NumberOfTries;c++)

{

ticket=OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Violet);

err=GetLastError();

if(err==0)

{

if(ticket>0) break;

}

else

{

if(err==0 || err==4 || err==136 || err==137 || err==138 || err==146) //Занятые ошибки

{

Sleep(5000);

continue;

}

else //нормальная ошибка

{

if(ticket>0) break;

}

}

}

break;

}

}

}

}

 

Все очень просто. Вам просто нужно вызвать его, как он будет что-то возвращать, только вам не нужно сохранять результат, потому что у типа void нет результата вообще. (ничего не возвращает) Вот так:

int start()

{

//----

if (Price >= PRICE_CLOSE)

subCloseOrder(); // At this point I'd like to call the function.How do I do that?

else

Alert("Do nothing"); //

//----

return(0);

}

 

Вместо этого используйте "void". Например, так

void someFunction(someParameters)

{

...

//

//

// no need to place return at the end, but if you want then use "just" return, like this

//

//

return;

}

Void означает, что функция не собирается возвращать значение, и таким образом она фактически становится процедурой, а не функцией.

Jonkie76:
Здравствуйте, ребята и девчата.

В какой-то момент в моей программе я хотел бы вызвать функцию.

Однако функция не имеет возвращаемого значения (void). Как же мне вызвать функцию?

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

как если бы он был написан на этом месте?

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

Надеюсь, кто-нибудь сможет помочь мне с этим, заранее спасибо, Jonkie76

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

//| экспертная функция запуска |

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

int start()

{

//----

if (Price >= PRICE_CLOSE)

call function ; //В данный момент я хочу вызвать функцию.Как это сделать?

else

Alert("Ничего не делать"); //

//----

return(0);

}

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

//===================================================================+

//ФУНКЦИИ

//===================================================================+

//----------------------- ФУНКЦИЯ ЗАКРЫТИЯ ОРДЕРА ----------------------+

void subCloseOrder()

{

int

i,

total = 0,

билет = 0,

ошибка = 0,

c = 0;

total = OrdersTotal();

for(i=total-1;i>=0;i--)

{

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

if(OrderSymbol()==Symbol() &&

OrderMagicNumber()==Magic)

{

switch(OrderType())

{

case OP_BUY :

for(c=0;c<NumberOfTries;c++)

{

ticket=OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Violet);

err=GetLastError();

if(err==0)

{

if(ticket>0) break;

}

else

{

if(err==0 || err==4 || err==136 || err==137 || err==138 || err==146) //Занятые ошибки

{

Sleep(5000);

continue;

}

else //нормальная ошибка

{

if(ticket>0) break;

}

}

}

break;

}

}

}

}
Причина обращения: