Спрашивайте! - страница 135

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

Спасибо за помощь. Я попытался добавить указанный вами код, но, честно говоря, я запутался. После того, как я добавил код, советник показывает ряд проблем. Я просмотрел синтаксис, но запутался.

У меня также возник вопрос об использовании функций внутри функции int start(). Разрешено ли это? Не могут ли переменные, инициализированные внутри функции, быть видны другим функциям?

Итак,

int start()

{

function( int x)

{

// Сделайте что-нибудь

return(x)

}

// Do Something ... "Можно ли вызвать x в функции start()?".

return0;

}

Я приложил исходный текст моего советника. Ваша помощь очень ценится.

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

//| CCCCCCCCIEA.mq4 aka 8xCIEA.mq4 |

//| By CuTzPR |

//|------------------------------------------------------------------+

#property copyright "CuTzPR@Forex-TSD"

//---- input parameters

extern double Risk_Percent=10;

extern bool Turned_On=true;

extern bool Allow_Risk=false;

extern bool TimeFilter=false;

extern double FromHourTrade=0; //Adjust for Broker GMT Time

extern double ToHourTrade=23; //Adjust for Broker GMT Time

extern double TP=20; // Take Profit Level

extern int MaxLong=5,MaxShort=5;

extern int MaxOpenOrders=10;

extern double Magic=10000;

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

//| expert start function |

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

int start()

{

int ticket;

double Lots;

bool Canopen,BlockTrade;

double Poin; // This variable was included to solve the problem where some brokers use 6 digit quotes instead of 5

static datetime timeprev; // Portion of coded was added to alloy only one trade per bar.

datetime CMT; //Close time of last trade

int total=OrdersTotal();

double Spread=Ask-Bid;

//This portion of code was added to only allow one trade per bar.

if(timeprev==Time[0])

{

return(0); //only execute on new bar

}

else if (timeprev==0)

{

timeprev=Time[0]; // do nothing if freshly added to chart

return(0);

}

else

{

timeprev=Time[0];

}

// End of alllow one trade per bar code

//*****Following code was added to control the Risk per trade.

if (Allow_Risk==true)

Lots=MathCeil(AccountFreeMargin() * Risk_Percent / 10000) / 10;

else Lots=0.1;

//End of Risk Code

//The following code was also included to solve the 6 digit broker quoting

if (Point == 0.00001) Poin = 0.0001; //6 digits

else if (Point == 0.001) Poin = 0.01; //3 digits (for Yen based pairs)

else Poin = Point; //Normal

//End Point Code

// Custom Functions

double cci=iCCI(NULL,PERIOD_M5,5,PRICE_TYPICAL,0);

double SATL=iCustom(NULL,PERIOD_H1,"$SATL",0,1);

// End of Custom Function

//Start of total count of open Long and Short Orders.

int totalOrders (totalBuy)

{

int totalNumber= 0;

for (int cnt = total ; cnt >=0 ; cnt-- )

{

OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);

if (OrderMagicNumber() == Magic && OrderType() == OP_BUY)

totalNumber++;

}

return (totalNumber);

}

int totalOrders (totalSell)

{

int totalNumber = 0;

for (int cnt = total ; cnt >=0 ; cnt-- )

{

OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);

if (OrderMagicNumber() == Magic && OrderType() == OP_SELL)

totalNumber++;

}

return(totalNumber);

}

int totalBuy = totalOrders(totalBuy);

int totalSell = totalOrders(totalSell);

int EAopenOrders=totalBuy+totalSell;

//End of total Open Long and Short count code

// Time filter Code

if (TimeFilter==true)

{

if (!(Hour() >= FromHourTrade && Hour() <= ToHourTrade && Minute() <=2))

BlockTrade=true;

else BlockTrade=false;

}

//End of time Filter code

// Are trades allowed to be opened?

if(EAopenOrders<=MaxOpenOrders && BlockTrade==false && Turned_On==true)

Canopen=true;

else if(EAopenOrders>MaxOpenOrders || BlockTrade==true || Turned_On==false)

Canopen=false;

// End of Allow code

//*****Trade Open Order Functions

if(Canopen==true)

{

if (totalBuy<=MaxLong)

{

if (cci>-100 && SATL<Ask)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"CCI0",Magic,0,Blue);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

Print("BUY order opened : ",OrderOpenPrice());

}

else Print ("Error opening BUY order : ",GetLastError());

return (0);

}

}

else if (totalSell<=MaxShort)

{

if (cciBid)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"CCI",Magic,0,Red);

if (ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

Print ("Sell order opened : ",OrderOpenPrice());

}

else Print("Error opening SELL Order : ",GetLastError());

return (0);

}

}

}// End of Trade Open Order Functions

//****Close Orders if they are profitable

for (int cnt = total ; cnt >=0 ; cnt-- )

{

OrderSelect(0,SELECT_BY_POS,MODE_TRADES);

if (OrderMagicNumber()==Magic)

{

if(OrderType()==OP_BUY && TP != 0 && totalBuy!= 0)

{

if(Bid >= ((OrderOpenPrice()+TP*Poin)+Spread))

{

OrderClose(OrderTicket(),OrderLots(),Bid,3,Green); // Long position closed.

CMT=OrderCloseTime();

return(0);

}

}

}

if (OrderMagicNumber()==Magic)

{

if(OrderType()==OP_SELL && TP != 0 && totalSell!=0 )

{

if(Ask <= ((OrderOpenPrice()-TP*Poin)+Spread))

{

OrderClose(OrderTicket(),OrderLots(),Ask,3,Green); // Short position closed.

CMT=OrderCloseTime();

return(0);

}

}

}

} // Close Profitable trades loop closed

}// End of Start function

Ваша помощь очень ценится.

 
Limstylz:
Привет всем,

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

Возможно, кто-то здесь может мне помочь?

Limstylz посмотрите на эту тему Ask! страница 39. Я думаю, там есть информация, которая может вам помочь. Удачи

 

Спасибо, дружище...

cutzpr:
Limstylz посмотрите на эту тему Ask! страница 39. Думаю, там есть информация, которая может вам помочь. Удачи

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

В любом случае, отвечая на ваш вопрос о int start ()... Это основное тело советника, которое обновляется непрерывно, каждый тик (я думаю, это правильно).

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

 

Что с этим не так?

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

Файлы:
 

Спасибо!!! это здорово!

 

Возвращаясь к чертежной доске

 

Встраивание пользовательского индикатора в советник

Здравствуйте, кто-нибудь знает, как добавить нижеприведенный пользовательский индикатор в советник? Чтобы не нужно было использовать icustom для вызова его из файла?

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

//| ARSI.mq4

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

#property copyright "Alexander Kirilyuk M."

#property link ""

#property indicator_separate_window

//#property indicator_chart_window

#property indicator_buffers 1

#property indicator_color1 DodgerBlue

extern int ARSIPeriod = 14;

//---- buffers

double ARSI[];

int init()

{

string short_name = "ARSI (" + ARSIPeriod + ")";

SetIndexStyle(0,DRAW_LINE);

SetIndexBuffer(0,ARSI);

//SetIndexDrawBegin(0,ARSIPeriod);

return(0);

}

int start()

{

int i, counted_bars = IndicatorCounted();

int limit;

if(Bars <= ARSIPeriod)

return(0);

if(counted_bars < 0)

{

return;

}

if(counted_bars == 0)

{

limit = Bars;

}

if(counted_bars > 0)

{

limit = Bars - counted_bars;

}

double sc;

for(i = limit; i >= 0; i--)

{

sc = MathAbs(iRSI(NULL, 0, ARSIPeriod, PRICE_CLOSE, i)/100.0 - 0.5) * 2.0;

if( Bars - i <= ARSIPeriod)

ARSI = Close;

else

ARSI = ARSI + sc * (Close - ARSI);

}

Print ("Try2 : " , ARSI[0], ":", ARSI[1]);

return(0);

}
 
yast77:
Здравствуйте, кто-нибудь знает, как добавить в советник пользовательский индикатор, приведенный ниже? Чтобы не нужно было использовать icustom для вызова его из файла?
//+------------------------------------------------------------------+

//| ARSI.mq4

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

#property copyright "Alexander Kirilyuk M."

#property link ""

#property indicator_separate_window

//#property indicator_chart_window

#property indicator_buffers 1

#property indicator_color1 DodgerBlue

extern int ARSIPeriod = 14;

//---- buffers

double ARSI[];

int init()

{

string short_name = "ARSI (" + ARSIPeriod + ")";

SetIndexStyle(0,DRAW_LINE);

SetIndexBuffer(0,ARSI);

//SetIndexDrawBegin(0,ARSIPeriod);

return(0);

}

int start()

{

int i, counted_bars = IndicatorCounted();

int limit;

if(Bars <= ARSIPeriod)

return(0);

if(counted_bars < 0)

{

return;

}

if(counted_bars == 0)

{

limit = Bars;

}

if(counted_bars > 0)

{

limit = Bars - counted_bars;

}

double sc;

for(i = limit; i >= 0; i--)

{

sc = MathAbs(iRSI(NULL, 0, ARSIPeriod, PRICE_CLOSE, i)/100.0 - 0.5) * 2.0;

if( Bars - i <= ARSIPeriod)

ARSI = Close;

else

ARSI = ARSI + sc * (Close - ARSI);

}

Print ("Try2 : " , ARSI[0], ":", ARSI[1]);

return(0);

}

Для вызова этого индикатора необходимо использовать функцию iCustom в вашем эксперте:

iCustom(Symbol(),0, "ARSI",ARSIPeriod,0,0);

Число, выделенное красным цветом, - это бар, на который вы хотите посмотреть. Измените его так, как вам нужно.

FerruFx

 
FerruFx:
Вы должны использовать функцию iCustom в вашем советнике для вызова этого индикатора:

iCustom(Symbol(),0, "ARSI",ARSIPeriod,0,0);

Число, выделенное красным цветом, - это бар, на который вы хотите посмотреть. Измените его так, как вам нужно.

FerruFx

Спасибо за ваш ответ. Да, я знаю, что мы можем использовать функцию icustom, но как я знаю, мы можем встроить функцию индикатора, введя кодировку из индикатора, следующий сайт Встраивание индикаторов в советники (альтернатива iCustom) | www.metatrader.info, который объяснил codersguru описывает об этом, но для индикатора ARSI, я не уверен, как встроить его в советник. Спасибо за любую рекомендацию!

 

улучшение 10points3

Привет всем.

Мы пытаемся улучшить 10points3. Нам нужно изменить код для закрытия последней третьей сделки. Пожалуйста, обратитесь к последним сообщениям здесь:

https://www.mql5.com/en/forum/174975/page259.

Здесь мы получаем хорошие результаты.

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