Советник на основе п.и trend.
Вот решил написать советник(пишу в первый раз), но выдает ошибку.Может кто подскажет в чем проблема.Заранее благодарю.
PHP код:
//+------------------------------------------------------------------+
//| igor4.mq4 |
//| Copyright © 2009, MetaQuotes Software Corp. |
//| https://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, MetaQuotes Software Corp."
#property link "https://www.metaquotes.net"
//---------------------------------------------------------------------------
extern double StopLoss =200;
extern double TakeProfit =100;
extern double Lots =0.1;
extern int period = 10;
extern int price = 1;
bool Mode_fact = false;
bool signals = false;
bool Work = true;
extern double Prots =0.07;
string Symb;
//-------------------------------------//
int start()
{
//----
int
Total,
Tip=-1,
Ticket;
double
valume,
Lot,
Lts,
Min_Lot,
Step,
Free,
One_Lot,
Price,
SL,
TP;
bool
Ans =false,
Cls_B = false,
Cls_S = false,
Opn_B = false,
Opn_S= false;
//-----------------------------------------------------------------------------------------//
Symb=Symbol();
Total=0;
for(int i=1; i<=OrdersTotal(); i++)
{ if (OrderSelect(i-1,SELECT_BY_POS)==true)
{ if (OrderSymbol()!=Symb)continue;
if (OrderType()>1)
{ Alert("Обнаружен отложенный ордер. Эксперт не работает.");
return;
}
Total ++;
if (Total > 1)
{
Alert("Несколько рыночных ордеров. Эксперт не работает.");
return;
}
Ticket=OrderTicket();
Tip =OrderType();
Price =OrderOpenPrice();
SL =OrderStopLoss();
Lot =OrderLots();
}
}
//--------------------------------------------------------------------//
valume =CurrentPrice-iBands(NULL,0,Bands_Period,Bands_Deviation,0,Bands_Mode,Power_Price,i);
if (valume > 0);
{
Opn_B=true;
Opn_S=true;
}
if (valume <= 0);
{
Cls_B=true;
Cls_S=true;
}
//------------------------------------------------------------------------------------------//
while(true)
{ if (Tip==0 && Cls_B==true)
{
Alert("Попытка закрыть Buy ",Ticket,". Ожидание ответа..");
RefreshRates();
Ans=OrderClose(Ticket,Lot,Bid,2);
if (Ans==true)
{ Alert ("Закрыт ордер Buy ",Ticket); break;
} if (Fun_Error(GetLastError())==1)
continue;
return; }
if (Tip==1 && Cls_S==true)
{
Alert("Попытка закрыть Sell ",Ticket,". Ожидание ответа..");
RefreshRates();
Ans=OrderClose(Ticket,Lot,Ask,2);
if (Ans==true)
{ Alert ("Закрыт ордер Sell ",Ticket);
break;
} if (Fun_Error(GetLastError())==1)
continue;
return;
}
break;
}
//-------------------------------------------------------------------------//
RefreshRates();
Min_Lot=MarketInfo(Symb,MODE_MINLOT);
Free =AccountFreeMargin();
One_Lot=MarketInfo(Symb,MODE_MARGINREQUIRED);
Step =MarketInfo(Symb,MODE_LOTSTEP);
if (Lots > 0)
Lts =Lots;
else
Lts=MathFloor(Free*Prots/One_Lot/Step)*Step;
if(Lts < Min_Lot) Lts=Min_Lot;
if (Lts*One_Lot > Free)
{ Alert(" Не хватает денег на ", Lts," лотов");
return;
}
//-------------------------------------------------------------------------------
while(true)
{ if (Total==0 && Opn_B==true)
{
RefreshRates();
SL=Bid - New_Stop(StopLoss)*Point;
TP=Bid + New_Stop(TakeProfit)*Point;
Alert("Попытка открыть Buy. Ожидание ответа..");
Ticket=OrderSend(Symb,OP_BUY,Lts,Ask,2,SL,TP);
if (Ticket > 0)
{ Alert ("Открыт ордер Buy ",Ticket);
return;
} if (Fun_Error(GetLastError())==1)
continue;
return;
} if (Total==0 && Opn_S==true)
{
RefreshRates();
SL=Ask + New_Stop(StopLoss)*Point;
TP=Ask - New_Stop(TakeProfit)*Point;
Alert("Попытка открыть Sell. Ожидание ответа..");
Ticket=OrderSend(Symb,OP_SELL,Lts,Bid,2,SL,TP);
if (Ticket > 0)
{ Alert ("Открыт ордер Sell ",Ticket);
return;
}
if (Fun_Error(GetLastError())==1)
continue;
return;
} break;
}
//----
return;
}
int Fun_Error(int Error){
switch(Error)
{
case 4: Alert("Торговый сервер занят. Пробуем ещё раз..");
Sleep(3000); return(1);
case 135:Alert("Цена изменилась. Пробуем ещё раз..");
RefreshRates(); return(1);
case 136:Alert("Нет цен. Ждём новый тик..");
while(RefreshRates()==false)Sleep(1);return(1); case 137:Alert("Брокер занят. Пробуем ещё раз..");
Sleep(3000);
return(1);case 146:Alert("Подсистема торговли занята. Пробуем ещё..");
Sleep(500);
return(1); case 2: Alert("Общая ошибка.");
return(0);case 5: Alert("Старая версия терминала.");
Work=false;
return(0); case 64: Alert("Счет заблокирован.");
Work=false;
return(0);case 133:Alert("Торговля запрещена.");
return(0);case 134:Alert("Недостаточно денег для совершения операции.");
return(0);default: Alert("Возникла ошибка ",Error); return(0); }
}
//-------------------------------------------------------------- 11 --
int New_Stop(int Parametr) // Проверка стоп-прик.
{
int Min_Dist=MarketInfo(Symb,MODE_STOPLEVEL);
if (Parametr < Min_Dist){
Parametr=Min_Dist; Alert("Увеличена дистанция стоп-приказа.");
}
return(Parametr);
}
Внизу я прикрепил, не уверен я, что у меня все правильно поэтому внизу укажу логику торговли:
Задача советника, чтобы он только один ордер делал на покупку, потом продавал. То есть играл на повышение.
Как мне произвести в жизнь этот алгоритм?
алгоритм, если volume > 0, то покупать, меньше или ровно продавать.
Вот сам индикатор.
https://forum.mql4.com/c/forum/2009/11/Trend.rar