Помогите написать советник.

 
Кто то может мне помочь написать советник. При котором условием открытия сделки будет достижение ценой определенного растояния до Параболика. Это расстояние, параметры параболика, стоп, таргет буду устанавливаться мной. В момент достижения ценой определенного растояния пунктов до параболика открывается селл по цене рынка (в случае если цена шла снизу), и одновременно выставляется ордер бай стоп на определенном растоние от откроытой сделки по рынкую (или наоборот бай открывается по цене рынка, а селл стоп ордером). желательно чтою эта функция мгновенного выставления ордера в противоположну сторону могла быть включенной и выключенной исходя из моего желания.(вроде on/off в параметрах). icq 438 281 710
 
Ну, давай, выкладывай код, что ты уже написал. Мы тебе подскажем где ошибки и как сделать лучше.
 
Roger писал(а) >>
Ну, давай, выкладывай код, что ты уже написал. Мы тебе подскажем где ошибки и как сделать лучше.

Здравствуйте.Написал вот такой советник по 4 индикаторам,показывает неплохие результаты, но вот проблема - не выставляет трелинг-стоп и не подтягивает его за ценой соответственно.Суть: 4 индикатора в зоне перепроданности - выставляется селл-стоп на заданном расстоянии и он должен следовать за ценой, сохраняя дистанцию, если вопреки индюкам цена пока еще идет вверх(т.е. не туда).При срабатывании ордера - выставляется стоп и трелинг.Код:

//+------------------------------------------------------------------+
//| aud_usd_15anatolyp.mq4 |
//| Copyright © 2008, MetaQuotes Software Corp. |
//| https://www.metaquotes.net/ |
//+------------------------------------------------------------------+
extern double TakeProfit = 55;
extern double Lots =0.01;
extern double TrailingStop = 15;

extern double StopLoss = 20;
extern int UrstoLow=40;
extern int UrstoHigh=60;
extern int Mn=1964;
extern int D=10;
extern int Expiration=15;
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
double Stoh, CCI ;
double DeM, RSI;
double RVISignalPrevious,RVISignalCurrent,RVICurrent, RVIPrevious;
int cnt, ticket, total, Exp;


Stoh=iStochastic(NULL,0,7,10,4,MODE_SMA,0,MODE_MAIN,0);
CCI=iCCI(NULL,0,9,PRICE_TYPICAL,0);
DeM=iDeMarker(NULL,0,5,0);
RSI=iRSI(NULL,0,5,PRICE_TYPICAL,0);

if(OrdersTotal()==0)
{
Exp=TimeCurrent()+60*Expiration;
// no opened orders identified
if(AccountFreeMargin()<(0.001*Lots))
{
Print("We have no money. Free Margin = ", AccountFreeMargin());
return(0);
}
// check for long position (BUY) possibility
if(Stoh<=40 && CCI<=-70 && RSI<=UrstoLow && DeM<=0.4)
{

ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,Ask+D*Point,0,
Ask-StopLoss*Point,Ask+D*Point+TakeProfit*Point,"anatol",Mn,Exp,Green);

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);
}
// check for short position (SELL) possibility
if(Stoh>=60 && CCI>=70 && RSI>=UrstoHigh && DeM>=0.60)
{
ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,Bid-D*Point,0,
Bid+StopLoss*Point,Bid-D*Point-TakeProfit*Point,"anatol",Mn,Exp,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);
}
return(0);
}
// it is important to enter the market correctly,
// but it is more important to exit it correctly...
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL && // check for opened position
OrderSymbol()==Symbol()) // check for symbol
{
if(OrderType()==OP_BUY) // long position is opened
{
// should it be closed?
if(Stoh>=UrstoHigh && CCI>=100 && RSI>=UrstoHigh && DeM>=0.70)
{
OrderClose(OrderTicket(),OrderLots(),Bid,0,Violet);
// close position
return(0); // exit
}
// check for trailing stop
if(TrailingStop>0)
{
if(Bid-OrderOpenPrice()>Point*TrailingStop)
{
if(OrderStopLoss()<Bid-Point*StopLoss)
{
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*StopLoss,
OrderTakeProfit(),0,Green);
return(0);
}
}
}
}
else // go to short position
{
// should it be closed?
if(Stoh<=UrstoLow && CCI<=-100 && RSI<=UrstoLow && DeM<=0.3)
{
OrderClose(OrderTicket(),OrderLots(),Ask,0,Violet);
// close position
return(0); // exit
}
// check for trailing stop
if(TrailingStop>0)
{
if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
{
if(OrderStopLoss()>(Ask+Point*StopLoss))
{
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*StopLoss,
OrderTakeProfit(),0,Red);
return(0);
}
}
}
}
}
}
return(0);
}
// the end.

Помогите доделать советника по заданным условиям (бьюсь уже неделю - не получается)

 

Кнопочка однако есть для вставки кода "SRC" называется.

 
Во-первых, нигде нет обработки ошибок, потом затрахаешься глюки искать.
Во-вторых, вынеси блок обработки трейлинга в самое начало функции старт, хотя это и не столь существенно.
В-третьих, выражение if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) требует, чтобы тикет уже был определен, а он у тебя равен нулю, поэтому и трейлить не может.
 
Roger писал(а) >>
Во-первых, нигде нет обработки ошибок, потом затрахаешься глюки искать.
Во-вторых, вынеси блок обработки трейлинга в самое начало функции старт, хотя это и не столь существенно.
В-третьих, выражение if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) требует, чтобы тикет уже был определен, а он у тебя равен нулю, поэтому и трейлить не может.

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

Зараннее спасибо.

 
anatolyp писал(а) >>

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

Зараннее спасибо.

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

//+------------------------------------------------------------------+
//| aud_usd_15anatolyp.mq4 |
//| Copyright © 2008, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
extern double TakeProfit = 55;
extern double Lots =0.01;
extern double TrailingStop = 15; 

extern double StopLoss = 20; 
extern int UrstoLow=40;
extern int UrstoHigh=60;
extern int Mn=1964;
extern int D=10; 
extern int Expiration=15; 
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
double Stoh, CCI ;
double DeM, RSI;
double RVISignalPrevious,RVISignalCurrent,RVICurrent, RVIPrevious; 
int cnt, ticket, Exp;


Stoh=iStochastic(NULL,0,7,10,4,MODE_SMA,0,MODE_MAIN,0);
CCI=iCCI(NULL,0,9,PRICE_TYPICAL,0);
DeM=iDeMarker(NULL,0,5,0);
RSI=iRSI(NULL,0,5,PRICE_TYPICAL,0);

if(OrdersTotal()!=0)
   {
   for(cnt=0;cnt<OrdersTotal();cnt++)
      {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL && // check for opened position 
      OrderSymbol()==Symbol()) // check for symbol
         {
         if(OrderType()==OP_BUY) // long position is opened
            {
            // should it be closed?
           if(Stoh>=UrstoHigh && CCI>=100 && RSI>=UrstoHigh && DeM>=0.70)
               {
                if(!OrderClose(OrderTicket(),OrderLots(),Bid,0,Violet))
               Print("ErrorCloseSell - ",GetLastError()); 
               // close position
               return(0); // exit
               }
            // check for trailing stop
            if(TrailingStop>0) 
               { 
               if(Bid-OrderOpenPrice()>Point*TrailingStop)
                  {
                  if(OrderStopLoss()<Bid-Point*StopLoss) 
                     {
                     if(!OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*StopLoss,
                     OrderTakeProfit(),0,Green))
                     Print("ErrorTrailingBuy - ",GetLastError()); 
                     return(0);
                     }
                  }
               }
            }
         else // go to short position
            {
            // should it be closed?
            if(Stoh<=UrstoLow && CCI<=-100 && RSI<=UrstoLow && DeM<=0.3)
               {
               if(!OrderClose(OrderTicket(),OrderLots(),Ask,0,Violet))
               Print("ErrorCloseSell - ",GetLastError()); 
               // close position
               return(0); // exit
               }
            // check for trailing stop
            if(TrailingStop>0) 
               { 
               if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
                  {
                  if(OrderStopLoss()>(Ask+Point*StopLoss)) 
                     {
                     if(!OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*StopLoss,
                     OrderTakeProfit(),0,Red))
                     Print("ErrorTrailingSell - ",GetLastError()); 
                     return(0);
                     }
                  }
               }
            }
         }
      }
   }
else
   {
   Exp=TimeCurrent()+60*Expiration;
   // no opened orders identified
   if(AccountFreeMargin()<(0.001*Lots))
      {
      Print("We have no money. Free Margin = ", AccountFreeMargin());
      return(0); 
      }
   // check for long position (BUY) possibility
   if(Stoh<=40 && CCI<=-70 && RSI<=UrstoLow && DeM<=0.4)
      {

      ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,Ask+D*Point,0,
      Ask-StopLoss*Point,Ask+D*Point+TakeProfit*Point,"anatol",Mn,Exp,Green);

      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); 
      }
      // check for short position (SELL) possibility
   if(Stoh>=60 && CCI>=70 && RSI>=UrstoHigh && DeM>=0.60)
      {
      ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,Bid-D*Point,0,
      Bid+StopLoss*Point,Bid-D*Point-TakeProfit*Point,"anatol",Mn,Exp,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); 
      }
   }
return(0);
}