Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Я думаю, что вы слишком усложняете ситуацию. Попробуйте использовать несколько коротких частей кода вместо одной большой функции. Это должно дать вам некоторую подсказку:
Спасибо за помощь. Я попытался добавить указанный вами код, но, честно говоря, я запутался. После того, как я добавил код, советник показывает ряд проблем. Я просмотрел синтаксис, но запутался.
У меня также возник вопрос об использовании функций внутри функции 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
Ваша помощь очень ценится.
Привет всем,
Изначально я разместил эту тему как новую, но она была перемещена в другую тему по программированию (у меня нет возражений против ее перемещения BTW) и теперь, похоже, потерялась из-за количества плакатов в этой теме.
Возможно, кто-то здесь может мне помочь?
Limstylz посмотрите на эту тему Ask! страница 39. Я думаю, там есть информация, которая может вам помочь. Удачи
Спасибо, дружище...
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);
}Здравствуйте, кто-нибудь знает, как добавить в советник пользовательский индикатор, приведенный ниже? Чтобы не нужно было использовать 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
Вы должны использовать функцию 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.
Здесь мы получаем хорошие результаты.