Помощь в кодировании - страница 62

 

...

Вы должны сделать две вещи
:- объявить переменную "period" как double (MQL иногда ведет себя странно, когда в делении используется переменная целого типа)

- инициализировать эту переменную "period" (прямо сейчас она неинициализирована, и поэтому последний шаг не сработал)

После этого вы получите что-то вроде этого:

Хороших выходных

chenairbin:
#property indicator_separate_window

#property indicator_buffers 1

#property indicator_color1 Red

#property indicator_maximum 100

#property indicator_level1 70

#property indicator_level2 50

#property indicator_level3 30

#property indicator_minimum 0

//---- входные параметры

extern int rsiperiod = 14 ;

extern int Shortperiod = 5 ;

extern int Middleperiod = 8;

extern int Longperiod = 13;

extern int mamode = 2 ;

//---- буферы

double RSI[];

double ShortRSI[];

double MiddleRSI[];

double LongRSI[];

double SMRSI[];

int period ;

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

//| Пользовательская функция инициализации индикатора |

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

int init()

{

//---- индикаторы

IndicatorBuffers(5);

SetIndexBuffer(0,SMRSI);

SetIndexBuffer(1,RSI);

SetIndexBuffer(2,ShortRSI);

SetIndexBuffer(3,MiddleRSI);

SetIndexBuffer(4,LongRSI);

//---- имя для DataWindow и метки подокна индикатора

IndicatorShortName("SMRSI("+rsiperiod+", "+Shortperiod+", "+Middleperiod+", "+Longperiod+", "+mamode+")");

SetIndexDrawBegin(0,rsiperiod+Longperiod);

period=Shortperiod+Middleperiod+Longperiod;

return(0);

}

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

//| Пользовательская функция итерации индикатора |

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

int start()

{

int counted_bars=IndicatorCounted();

int i,limit;

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

if(counted_bars>0) counted_bars--;

limit = Bars-counted_bars;

for( i=limit; i>=0; i--) RSI=iRSI(NULL,0,rsiperiod,0,i);

for( i=limit; i>=0; i--) ShortRSI=iMAOnArray(RSI,0,Shortperiod,0,mamode,i);

for( i=limit; i>=0; i--) MiddleRSI=iMAOnArray(RSI,0,Middleperiod,0,mamode,i);

for( i=limit; i>=0; i--) LongRSI=iMAOnArray(RSI,0,Longperiod,0,mamode,i);

for( i=limit; i>=0; i--) { if(period!=0) SMRSI=(Shortperiod/period)*ShortRSI+(Middleperiod/period)*MiddleRSI+(Longperiod/period)*LongRSI;}

return(0);

}

//+------------------------------------------------------------------+
Файлы:
smrsi.gif  33 kb
_test0.mq4  3 kb
 

n_n

mladen:
Вы должны сделать 2 вещи
:- объявить переменную "period" как double (MQL иногда ведет себя странно, когда в делении используется переменная целого типа)

- инициализировать эту переменную "period" (прямо сейчас она неинициализирована, и поэтому последний шаг не сработал)

.

После этого вы получите что-то вроде этого:

Хороших выходных

Спасибо!

 

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

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

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

Спасибо за вашу отзывчивость.

cronex_taichi.mq4

Файлы:
 

dasio

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

int init()

{

return(0);

}

int start()

{

Comment(iCustom(NULL,0,"Cronex Taichi",0,0));

return(0);

}

dasio:
Привет,

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

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

Спасибо за вашу отзывчивость.

cronex_taichi.mq4
 
mladen:
dasio

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

int init()

{

return(0);

}

int start()

{

Comment(iCustom(NULL,0,"Cronex Taichi",0,0));

return(0);

}

Спасибо, за ваш ответ,

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

Я не знаю почему.

Тем не менее, спасибо за вашу отзывчивость.

 

Привет,

Я нашел проблему. Теперь все в порядке.

У меня другая проблема с другим ea.

У меня есть два кода, и функция Lotti() должна возвращать мне количество лотов для ордеров.

Когда я компилирую его, я получаю Posizioni Internal Error. Что случилось? Спасибо;

int OTBM(int intMagic)//OrdersTotalByMagic

{

int intCount=0;

int intPOS=0;

bool boolTerm=false;

while(boolTerm==false)

{

if(OrderSelect(intPOS,SELECT_BY_POS))

{

if(OrderMagicNumber()==intMagic) intCount++;

intPOS++;

}

else

boolTerm=true;

}

return(intCount);

}

[/PHP]

[PHP]int Lotti(){

int Lotti;

int Posizioni=OTBM(MagicNumber);

switch (Posizioni)

{

case 0 : Lotti=0.1; break;

case 1 : Lotti=0.2; break;

case 2 : Lotti=0.4; break;

case 3 : Lotti=0.8; break;

case 4 : Lotti=1.6; break;

case 5 : Lotti=3.2; break;

case 6 : Lotti=6.4; break;

case 7 : Lotti=12.8; break;

}

return(Lotti);

}
 

Попробуйте заменить OTBM() на это :

int OTBM(int intMagic)//OrdersTotalByMagic

{

int intCount=0;

for (int i=OrdersTotal()-1; i>=0; i--)

{

if(OrderSelect(i,SELECT_BY_POS))

{

if(OrderMagicNumber()==intMagic) intCount++;

}

}

return(intCount);

}

[/PHP]

dasio:
Hi,

i found the problem. Now all its ok.

I have another problem with another ea.

I have this two code and the function Lotti() would be return me the number of lot for an ordersend.

When i compile it i receive Posizioni Internal Error. What's wrong? Thank you;

int OTBM(int intMagic)//OrdersTotalByMagic

{

int intCount=0;

int intPOS=0;

bool boolTerm=false;

while(boolTerm==false)

{

if(OrderSelect(intPOS,SELECT_BY_POS))

{

if(OrderMagicNumber()==intMagic) intCount++;

intPOS++;

}

else

boolTerm=true;

}

return(intCount);

}

[PHP]int Lotti(){

int Lotti;

int Posizioni=OTBM(MagicNumber);

switch (Posizioni)

{

case 0 : Lotti=0.1; break;

case 1 : Lotti=0.2; break;

case 2 : Lotti=0.4; break;

case 3 : Lotti=0.8; break;

case 4 : Lotti=1.6; break;

case 5 : Lotti=3.2; break;

case 6 : Lotti=6.4; break;

case 7 : Lotti=12.8; break;

}

return(Lotti);

}
 

Привет, -.-"

Я не нахожу покоя с этими кодами, эхехехе.

У меня проблема с функцией, которая должна вывести мне прибыль всех открытых ордеров, но я думаю, что она не работает, потому что условие никогда не соблюдалось. Ниже код:

.....

if(Profit()>=0.....[/PHP]

[PHP]double Profit()

{

int total=OrdersTotal();

double profit=0;

for(int i=0; i<total; i++)

{

OrderSelect(i,SELECT_BY_POS,MODE_TRADES);

if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) continue;

profit+=OrderProfit();

}

return(profit);

}
 

dasio

Попробуйте так :

.....

if(Profit()>=0.....[/PHP]

double Profit()

{

int total=OrdersTotal();

double profit=0;

for(int i=0; i<total-1; i++)

{

OrderSelect(i,SELECT_BY_POS,MODE_TRADES);

if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=MagicNumber) continue;

profit+=OrderProfit();

}

return(profit);

}[/PHP]

dasio:
Hi, -.-"

I do not find peace with these codes eheheh.

I have a problem with a function that have to result me the profit of all openorder but i think it's not work because the condition never been respected. Below the code:

[PHP].....

if(Profit()>=0.....

[PHP]double Profit()

{

int total=OrdersTotal();

double profit=0;

for(int i=0; i<total; i++)

{

OrderSelect(i,SELECT_BY_POS,MODE_TRADES);

if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) continue;

profit+=OrderProfit();

}

return(profit);

}
 
mladen:
dasio

Попробуйте вот так:

.....

if(Profit()>=0.....[/PHP]

[PHP]double Profit()

{

int total=OrdersTotal();

double profit=0;

for(int i=0; i<total-1; i++)

{

OrderSelect(i,SELECT_BY_POS,MODE_TRADES);

if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=MagicNumber) continue;

profit+=OrderProfit();

}

return(profit);

}

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

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