Скачать MetaTrader 5

Помогите с OrderClose!

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Forex Trader
114277
Forex Trader  
Здравствуйте!
Ниже код советника.
При тестировании, не совершая ни одной сделки, пишет в журнале:
invalid ticket for OrderClose function много, много раз и все. Идея системы:
- в начале задаем некоторый начальный уровень Middle - значение цены и величину шага -s - в пунктах
- далее проверяем: если максимальная цена High больше суммы -
Middle + s+ случайная величина (её генерация описывается функцией gauss в начале алгоритма), то новое значение Middle = старое значение Middle +s+ сл величина, и в следующий раз берется уже это полученное значение, и т.д.
-и открывается ордер на buy, если он ещё не открыт, закрывется ордер на sell, если таковой открыт

Соответственно,
-если минимальная цена Low оказывается меньше суммы
Middle + s+ случайная величина, то новое значение Middle = старое значение Middle - s+ сл величина, и сделки совершаются наоборот.

Подскажите, где тут ошибка!


extern double Lots = 0.1; 
extern double Middle = 1.2850;
extern double s=0.0010;

int rand_seed;
int i, ticket;


#define c1 523793
#define c2 19157
#define c3 738623

#define gs_step 0.1
#define gs_tail 10
#define PI 3.1415926535897932384626433832795

double random(double scale)
{
   rand_seed = (((c1 + rand_seed * c2) % c3) + 2 * c3) % c3;
   return ( scale * rand_seed / c3 );
}

double gauss() {
   double s = 0, p = random(1);
   // sqrt(2 * PI) = 2,506628274631000502415765284811   
   for(double x = -gs_tail; x < gs_tail; x += gs_step)
   {
      s += gs_step * MathExp(-0.5 * x * x) / MathSqrt( 2 * PI );
      if (s > p) return ((x + 10) / 20);
   }
   return ((gs_tail + 10) / 20);
}

void start(){
 bool   result;
 int i;
 
 if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }
 if(High[1] >= Middle+s+gauss()) {
  
  OrderSelect(1, SELECT_BY_POS, MODE_TRADES); 
  if (OrderType()==OP_BUY) return (0);  
  if (OrderType()==OP_SELL) { 
   result=OrderClose(OrderTicket(),OrderLots(),Ask,10,Yellow);
   return (0);
  }
  ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0, "simple",16384,0,Green); 
  if(ticket>0){ 
   if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice()); 
  }
  Middle = Middle+s+gauss();
 } 
if(Low[1] <= Middle-s+gauss()) {
  
  OrderSelect(1, SELECT_BY_POS, MODE_TRADES); 
  if (OrderType()==OP_SELL) return (0);  
  if (OrderType()==OP_BUY) { 
   result=OrderClose(OrderTicket(),OrderLots(),Bid,10,Yellow); 
   return (0);
  }
  ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0, "simple",16384,0,Green); 
  if(ticket>0){ 
   if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Sell order opened : ",OrderOpenPrice()); 
  }
  Middle = Middle-s+gauss();
 } 
}

int init()  {
   rand_seed = 13;   
   return(0);
}




Спасибо

Forex Trader
114277
Forex Trader  
Почему Вы решили, что у Вас закрываемый ордер всегда имеет номер 1?
OrderSelect(1, SELECT_BY_POS, MODE_TRADES);
http://www.alpari-idc.ru/ru/experts/articles/8.html
http://www.alpari-idc.ru/ru/experts/articles/9.html
Forex Trader
114277
Forex Trader  
Смотрите как я сделала:



 if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }
        
 if(High[1] >= Middle+s+gauss()) {
 
  [b]  total=OrdersTotal();
  for(int l=0;l<total;l++)
     {
      OrderSelect(l, SELECT_BY_POS, MODE_TRADES); 
      if (OrderType()==OP_BUY) return (0);  
      if (OrderType()==OP_SELL) { 
      result=OrderClose(OrderTicket(),OrderLots(),Ask,10,Yellow);
      return (0);
       }
     } [/b]
  ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0, "simple",16384,0,Green); 
  if(ticket>0){ 
   if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice()); 
  }
  Middle = Middle+s+gauss();
 } 
 
if(Low[1] <= Middle-s+gauss()) {

 [b]
 total=OrdersTotal();
  for(l=0;l<total;l++)
     { 
      OrderSelect(l, SELECT_BY_POS, MODE_TRADES); 
      if (OrderType()==OP_SELL) return (0);  
      if (OrderType()==OP_BUY) { 
      result=OrderClose(OrderTicket(),OrderLots(),Bid,10,Yellow); 
      return (0);
       }
     } [/b]
  ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0, "simple",16384,0,Green); 
  if(ticket>0){ 
   if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Sell order opened : ",OrderOpenPrice()); 
  }
  Middle = Middle-s+gauss();
 } 
}

int init()  {
   rand_seed = 13;   
   return(0);
}



Теперь система открывает одну единственную сделку, всегда на sell, потом пишет в журнале что нет маржи и закрывает по close at stop .
Наверное, вообще не закрывает ордера.
При изменении параметра s результат абсолютно не меняется, все те же цифры.

В чем может быть дело?
Я по природе не программист, мне программу помогли написать, но те, кто помогли, глубоко в этих вещах не разбираются. Честно скажу, мне это нужно для дипломной работы, и мне кажется, что кроме участников данного форума мне помочь никто не сможет.
Извините за лирику
Спасибо


Forex Trader
114277
Forex Trader  
Напишите мне на мейл или в асю ( "MQL4: профиль пользователя komposter" ), что именно должен делать советник.
Проще будет написать заново, чем копаться в чужом коде ;)
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий