помогите дописать экспперта (несложного)

 

Не могу понять че здесь не правильно,

Вообщем по задумке, хотел написать эксперта, который бы открывал по 1 ордеру, допустим buy, c tp=100 и tl=100, ждал пока он не закроется, не важно с профитом или без, и открывал новый sell c tp=100 и tl=100, и так по кругу пока деньги есть.

 
#property copyright "Copyright © 2006, MetaQuotes Software Corp."
#property link      "http://wolf002.narod.ru"
extern double TakeProfit = 100;
extern double TakeLost = 100;
extern double Lots = 1;
bool smena;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
bool smena=true;
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
    
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
int ticket,total;
total = OrdersTotal();
   if(total<1) 
   {
      if (smena==true)
      smena=false;
      {
      ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-TakeLost*Point,Ask+TakeProfit*Point,"My order #1",16384,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
        {
      smena=true;
      ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+TakeLost*Point,Bid-TakeProfit*Point,"My order #1",16384,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); 
         
         }
       } 
      return(0);
     
//----
 
   return(0);

Код по чему не пашет,

Во первых открывается сразу много ордеров, а не один, как было задумано.

Во вторых сначала отрывается buy, а потом все sell.

В третьих когда extern double Lots = 0.1; Выдается ошибку номер 131, это чето связаное с нормализацией лота. Но раньше так все работало.

Жду ВАШЕЙ ПОМОЩИ.

 
telnet:

Не могу понять че здесь не правильно,

Вообщем по задумке, хотел написать эксперта, который бы открывал по 1 ордеру, допустим buy, c tp=100 и tl=100, ждал пока он не закроется, не важно с профитом или без, и открывал новый sell c tp=100 и tl=100, и так по кругу пока деньги есть.

 
#property copyright "Copyright © 2006, MetaQuotes Software Corp."
#property link      "http://wolf002.narod.ru"
extern double TakeProfit = 100;
extern double TakeLost = 100;
extern double Lots = 1;
bool smena;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
bool smena=true;
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
    
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
int ticket,total;
total = OrdersTotal();
   if(total<1) 
   {
      if (smena==true)
      smena=false;
      {
      ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-TakeLost*Point,Ask+TakeProfit*Point,"My order #1",16384,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
        {
      smena=true;
      ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+TakeLost*Point,Bid-TakeProfit*Point,"My order #1",16384,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); 
         
         }
       } 
      return(0);
     
//----
 
   return(0);

Код по чему не пашет,

Во первых открывается сразу много ордеров, а не один, как было задумано.

Во вторых сначала отрывается buy, а потом все sell.

В третьих когда extern double Lots = 0.1; Выдается ошибку номер 131, это чето связаное с нормализацией лота. Но раньше так все работало.

Жду ВАШЕЙ ПОМОЩИ.


Так он и должен кучу орднеров открывать.

Надо контроль количества открытых ордеров делать. В форуме на эту тему много написано.

И переменную нужно для вида открытого ордера.

 
Фигурные скобки правильно расставьте, и будет вам щастье!
Например здесь 
if (smena==true)
      smena=false;
      {
       ....
      }
выражение в скобках будет выполняться всегда, т.е. независимо от значения smena
 
Логика работы эксперта нарушена из-за неправильной растановки фигурных скобок. Посмотрите внимательно - для каждой фигурной скобки найдите ту, которая закрывает блок. Используйте отступ. Условие проверки переменной "smena" - копать здесь :-) И в функции init незачем заново объявлять переменную, которая является глобальной.
 
Добавлю ещё одну рекомендацию - значение переменной "smena" менять только после удачного открытия ордера. Надеюсь понятно почему?
 

Всем спасибо вот рабочий код.

#property copyright "Copyright © 2006, MetaQuotes Software Corp."
#property link      "http://wolf002.narod.ru"
extern double TakeProfit = 10;
extern double TakeLost = 10;
extern double Lots = 0.1;
bool smena;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
bool smena=true;
 
  }
//+------------------------------------------------------------------+
int start()
  {
int ticket,total;
total = OrdersTotal();
   if(total<1) 
   {
      if (smena == true)
      {
      RefreshRates();
      ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-TakeLost*Point,Ask+TakeProfit*Point,"My order #1",16384,0,Blue);
      if(ticket>0)
         {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
               Print("BUY order opened : ",OrderOpenPrice()," smena= ",smena);
               smena=false;
         }
         else Print("Error opening BUY order : ",GetLastError()); 
         return(0); 
         
        }
         else
        {
           RefreshRates();
           ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+TakeLost*Point,Bid-TakeProfit*Point,"My order #1",16384,0,Red);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
               Print("SELL order opened : ",OrderOpenPrice()," smena= ",smena);
               smena=true;
           }
         else Print("Error opening SELL order : ",GetLastError()); 
         return(0); 
         
         }
       } 
      return(0);
     
//----
 
   return(0);
  }
//+------------------------------------------------------------------+