[АРХИВ]Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 5. - страница 203

 
Здравствуйте!Подскажите пожалуйста команду (если таковая есть), случайного выбора числа либо 0 либо 1, заранее благодарен
 
hoz:


 Ну для начала скобки привыкни вставлять там где нужно. Типа того:

 

А вообще, у тебя должен быть диапазон времени, а не фикс. значения. Логика у тебя не верная вообще. Не 1час ИЛИ 3 часа, а от 1 часа до 3 часов!!!
Спасибо.Ошибку понял.
 
stater:
Здравствуйте!Подскажите пожалуйста команду (если таковая есть), случайного выбора числа либо 0 либо 1, заранее благодарен
int x =MathRand() % 2;
 

При тестировании Эксперта выявились ошибки исполнения кода:
- исполнение оператора цикла for(i=0;i<OrdersTotal();i++) прерывается следующим тиком (ниже выделено шрифтом Bold),
- ордера buy выбираются и закрываются в произвольном порядке.

Подскажите, пожалуйста, как установить причину и устранить?
Код программы и отчёт из журнала тестера привожу.

 Код программы.

//+------------------------------------------------------------------+
//|                                                     Poligon1.mq4 |
//|                        Copyright 2012, MetaQuotes Software Corp. |
//|Тест оператора цикла.                                             |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, MetaQuotes Software Corp."
#property link      ""
//+------------------------------------------------------------------+
//|Объявленные переменные                                            |
//+------------------------------------------------------------------+
int Mn=357;//Magic number
int i;//Показатель счётчика итераций
double PriTP;//TP серии
int Tick;//Счётчик тиков
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----Установка ордеров
OrderSend(Symbol(),OP_BUY,0.5,Ask,0,Bid-350*Point,Ask+350*Point,NULL,Mn,0,CLR_NONE);//
OrderSend(Symbol(),OP_BUY,1,Ask,0,Bid-250*Point,Ask+250*Point,NULL,Mn,0,CLR_NONE);//
OrderSend(Symbol(),OP_BUY,1.5,Ask,0,Bid-150*Point,Ask+150*Point,NULL,Mn,0,CLR_NONE);//
OrderSend(Symbol(),OP_BUY,2.5,Ask,0,Bid-150*Point,Ask+150*Point,NULL,Mn,0,CLR_NONE);//
OrderSend(Symbol(),OP_BUY,3.5,Ask,0,Bid-150*Point,Ask+150*Point,NULL,Mn,0,CLR_NONE);//
OrderSend(Symbol(),OP_BUYLIMIT,1,Ask-150*Point,0,Bid-400*Point,
Ask+250*Point,NULL,Mn,0,CLR_NONE);//
OrderSend(Symbol(),OP_SELLSTOP,3,Ask-300*Point,0,Bid+150*Point,
Ask-750*Point,NULL,Mn,0,CLR_NONE);//
//----
   PriTP=Bid;//PriTP
   Print("Кс0:"," OrdersTotal=",OrdersTotal());//Сообщение
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
  
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----Счётчик Tick
   Tick++;//Tick
//----Закрываем ордера BUY
   for(i=0;i<OrdersTotal();i++)//Инициализация цикла
   {
   Print("Кс1:"," Tick=",Tick," i=",i);//Сообщение
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)//Выбор ордера i
    {
   if(OrderSymbol()==Symbol())//Символ
     {
   if(OrderMagicNumber()==Mn)//Идентификационное число
      {
   if(OrderType()==OP_BUY && OrderTakeProfit()>PriTP)//Тип операции текущего выбранного ордера
       {
   OrderClose(OrderTicket(),OrderLots(),Bid,0,CLR_NONE);//Закрытие позиции
       }//Закрыто if(OrderType()==OP_BUY && OrderTakeProfit()>PriTP)
      }//Закрыто if(OrderMagicNumber()==Mn)
     }//Закрыто if(OrderSymbol()==Symbol()
    }//Закрыто if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
   }//Закрыто for(i=0;i<OrdersTotal();i++)
//----
   return(0);
  }

Записи из журнала тестера.

2013.03.01 12:12:57 2012.09.03 00:00  Poligon1 EURUSD,M15: Кс1: Tick=5 i=1
2013.03.01 12:12:57 2012.09.03 00:00  Poligon1 EURUSD,M15: Кс1: Tick=5 i=0
2013.03.01 12:12:33 2012.09.03 00:00  Poligon1 EURUSD,M15: Кс1: Tick=4 i=1
2013.03.01 12:12:33 2012.09.03 00:00  Poligon1 EURUSD,M15: Кс1: Tick=4 i=0
2013.03.01 12:12:09 2012.09.03 00:00  Poligon1 EURUSD,M15: Кс1: Tick=3 i=1
2013.03.01 12:12:09 2012.09.03 00:00  Poligon1 EURUSD,M15: close #4 buy 2.50 EURUSD at 1.25773 sl: 1.25616 tp: 1.25923 at price 1.25770
2013.03.01 12:12:09 2012.09.03 00:00  Poligon1 EURUSD,M15: Кс1: Tick=3 i=0
2013.03.01 12:11:45 2012.09.03 00:00  Poligon1 EURUSD,M15: Кс1: Tick=2 i=2
2013.03.01 12:11:45 2012.09.03 00:00  Poligon1 EURUSD,M15: Кс1: Tick=2 i=1
2013.03.01 12:11:45 2012.09.03 00:00  Poligon1 EURUSD,M15: close #2 buy 1.00 EURUSD at 1.25773 sl: 1.25516 tp: 1.26023 at price 1.25768
2013.03.01 12:11:45 2012.09.03 00:00  Poligon1 EURUSD,M15: Кс1: Tick=2 i=0
2013.03.01 12:11:21 2012.09.03 00:00  Poligon1 EURUSD,M15: Кс1: Tick=1 i=3
2013.03.01 12:11:21 2012.09.03 00:00  Poligon1 EURUSD,M15: close #5 buy 3.50 EURUSD at 1.25773 sl: 1.25616 tp: 1.25923 at price 1.25766
2013.03.01 12:11:21 2012.09.03 00:00  Poligon1 EURUSD,M15: Кс1: Tick=1 i=2
2013.03.01 12:11:21 2012.09.03 00:00  Poligon1 EURUSD,M15: close #3 buy 1.50 EURUSD at 1.25773 sl: 1.25616 tp: 1.25923 at price 1.25766
2013.03.01 12:11:21 2012.09.03 00:00  Poligon1 EURUSD,M15: Кс1: Tick=1 i=1
2013.03.01 12:11:21 2012.09.03 00:00  Poligon1 EURUSD,M15: close #1 buy 0.50 EURUSD at 1.25773 sl: 1.25416 tp: 1.26123 at price 1.25766
2013.03.01 12:11:21 2012.09.03 00:00  Poligon1 EURUSD,M15: Кс1: Tick=1 i=0
2013.03.01 12:11:21 2012.09.03 00:00  Poligon1 EURUSD,M15: Кс0: OrdersTotal=7
2013.03.01 12:11:21 2012.09.03 00:00  Poligon1 EURUSD,M15: open #7 sell stop 3.00 EURUSD at 1.25473 sl: 1.25916 tp: 1.25023 ok
2013.03.01 12:11:21 2012.09.03 00:00  Poligon1 EURUSD,M15: open #6 buy limit 1.00 EURUSD at 1.25623 sl: 1.25366 tp: 1.26023 ok
2013.03.01 12:11:21 2012.09.03 00:00  Poligon1 EURUSD,M15: open #5 buy 3.50 EURUSD at 1.25773 sl: 1.25616 tp: 1.25923 ok
2013.03.01 12:11:21 2012.09.03 00:00  Poligon1 EURUSD,M15: open #4 buy 2.50 EURUSD at 1.25773 sl: 1.25616 tp: 1.25923 ok
2013.03.01 12:11:21 2012.09.03 00:00  Poligon1 EURUSD,M15: open #3 buy 1.50 EURUSD at 1.25773 sl: 1.25616 tp: 1.25923 ok
2013.03.01 12:11:21 2012.09.03 00:00  Poligon1 EURUSD,M15: open #2 buy 1.00 EURUSD at 1.25773 sl: 1.25516 tp: 1.26023 ok
2013.03.01 12:11:21 2012.09.03 00:00  Poligon1 EURUSD,M15: open #1 buy 0.50 EURUSD at 1.25773 sl: 1.25416 tp: 1.26123 ok
2013.03.01 12:11:21 Poligon1 test started
2013.03.01 12:11:21 Poligon1 EURUSD,M15: loaded successfully

С уважением. Shurkin 

 
Shurkin:

При тестировании Эксперта выявились ошибки исполнения кода:
- исполнение оператора цикла for(i=0;i<OrdersTotal();i++) прерывается следующим тиком (ниже выделено шрифтом Bold),
- ордера buy выбираются и закрываются в произвольном порядке.

С уважением. Shurkin 


1. Нельзя открывать ордера в функции init().(В тестере еще прокатит, но уже на демо работать не будет)

2. Когда закрываете ордера, считать надо с конца к началу, а не наоборот, как у Вас. 

 
Shurkin:

При тестировании Эксперта выявились ошибки исполнения кода:
- исполнение оператора цикла for(i=0;i<OrdersTotal();i++) прерывается следующим тиком (ниже выделено шрифтом Bold),
- ордера buy выбираются и закрываются в произвольном порядке.

Подскажите, пожалуйста, как установить причину и устранить?
Код программы и отчёт из журнала тестера привожу.

 Код программы.

//+------------------------------------------------------------------+
//|                                                     Poligon1.mq4 |
//|                        Copyright 2012, MetaQuotes Software Corp. |
//|Тест оператора цикла.                                             |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, MetaQuotes Software Corp."
#property link      ""
//+------------------------------------------------------------------+
//|Объявленные переменные                                            |
//+------------------------------------------------------------------+
int Mn=357;//Magic number
int i;//Показатель счётчика итераций
double PriTP;//TP серии
int Tick;//Счётчик тиков
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----Установка ордеров
OrderSend(Symbol(),OP_BUY,0.5,Ask,0,Bid-350*Point,Ask+350*Point,NULL,Mn,0,CLR_NONE);//
OrderSend(Symbol(),OP_BUY,1,Ask,0,Bid-250*Point,Ask+250*Point,NULL,Mn,0,CLR_NONE);//
OrderSend(Symbol(),OP_BUY,1.5,Ask,0,Bid-150*Point,Ask+150*Point,NULL,Mn,0,CLR_NONE);//
OrderSend(Symbol(),OP_BUY,2.5,Ask,0,Bid-150*Point,Ask+150*Point,NULL,Mn,0,CLR_NONE);//
OrderSend(Symbol(),OP_BUY,3.5,Ask,0,Bid-150*Point,Ask+150*Point,NULL,Mn,0,CLR_NONE);//
OrderSend(Symbol(),OP_BUYLIMIT,1,Ask-150*Point,0,Bid-400*Point,
Ask+250*Point,NULL,Mn,0,CLR_NONE);//
OrderSend(Symbol(),OP_SELLSTOP,3,Ask-300*Point,0,Bid+150*Point,
Ask-750*Point,NULL,Mn,0,CLR_NONE);//
//----
   PriTP=Bid;//PriTP
   Print("Кс0:"," OrdersTotal=",OrdersTotal());//Сообщение
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
  
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----Счётчик Tick
   Tick++;//Tick
//----Закрываем ордера BUY
   for(i=0;i<OrdersTotal();i++)//Инициализация цикла
   {
   Print("Кс1:"," Tick=",Tick," i=",i);//Сообщение
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)//Выбор ордера i
    {
   if(OrderSymbol()==Symbol())//Символ
     {
   if(OrderMagicNumber()==Mn)//Идентификационное число
      {
   if(OrderType()==OP_BUY && OrderTakeProfit()>PriTP)//Тип операции текущего выбранного ордера
       {
   OrderClose(OrderTicket(),OrderLots(),Bid,0,CLR_NONE);//Закрытие позиции
       }//Закрыто if(OrderType()==OP_BUY && OrderTakeProfit()>PriTP)
      }//Закрыто if(OrderMagicNumber()==Mn)
     }//Закрыто if(OrderSymbol()==Symbol()
    }//Закрыто if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
   }//Закрыто for(i=0;i<OrdersTotal();i++)
//----
   return(0);
  }

Записи из журнала тестера.

2013.03.01 12:12:57 2012.09.03 00:00  Poligon1 EURUSD,M15: Кс1: Tick=5 i=1
2013.03.01 12:12:57 2012.09.03 00:00  Poligon1 EURUSD,M15: Кс1: Tick=5 i=0
2013.03.01 12:12:33 2012.09.03 00:00  Poligon1 EURUSD,M15: Кс1: Tick=4 i=1
2013.03.01 12:12:33 2012.09.03 00:00  Poligon1 EURUSD,M15: Кс1: Tick=4 i=0
2013.03.01 12:12:09 2012.09.03 00:00  Poligon1 EURUSD,M15: Кс1: Tick=3 i=1
2013.03.01 12:12:09 2012.09.03 00:00  Poligon1 EURUSD,M15: close #4 buy 2.50 EURUSD at 1.25773 sl: 1.25616 tp: 1.25923 at price 1.25770
2013.03.01 12:12:09 2012.09.03 00:00  Poligon1 EURUSD,M15: Кс1: Tick=3 i=0
2013.03.01 12:11:45 2012.09.03 00:00  Poligon1 EURUSD,M15: Кс1: Tick=2 i=2
2013.03.01 12:11:45 2012.09.03 00:00  Poligon1 EURUSD,M15: Кс1: Tick=2 i=1
2013.03.01 12:11:45 2012.09.03 00:00  Poligon1 EURUSD,M15: close #2 buy 1.00 EURUSD at 1.25773 sl: 1.25516 tp: 1.26023 at price 1.25768
2013.03.01 12:11:45 2012.09.03 00:00  Poligon1 EURUSD,M15: Кс1: Tick=2 i=0
2013.03.01 12:11:21 2012.09.03 00:00  Poligon1 EURUSD,M15: Кс1: Tick=1 i=3
2013.03.01 12:11:21 2012.09.03 00:00  Poligon1 EURUSD,M15: close #5 buy 3.50 EURUSD at 1.25773 sl: 1.25616 tp: 1.25923 at price 1.25766
2013.03.01 12:11:21 2012.09.03 00:00  Poligon1 EURUSD,M15: Кс1: Tick=1 i=2
2013.03.01 12:11:21 2012.09.03 00:00  Poligon1 EURUSD,M15: close #3 buy 1.50 EURUSD at 1.25773 sl: 1.25616 tp: 1.25923 at price 1.25766
2013.03.01 12:11:21 2012.09.03 00:00  Poligon1 EURUSD,M15: Кс1: Tick=1 i=1
2013.03.01 12:11:21 2012.09.03 00:00  Poligon1 EURUSD,M15: close #1 buy 0.50 EURUSD at 1.25773 sl: 1.25416 tp: 1.26123 at price 1.25766
2013.03.01 12:11:21 2012.09.03 00:00  Poligon1 EURUSD,M15: Кс1: Tick=1 i=0
2013.03.01 12:11:21 2012.09.03 00:00  Poligon1 EURUSD,M15: Кс0: OrdersTotal=7
2013.03.01 12:11:21 2012.09.03 00:00  Poligon1 EURUSD,M15: open #7 sell stop 3.00 EURUSD at 1.25473 sl: 1.25916 tp: 1.25023 ok
2013.03.01 12:11:21 2012.09.03 00:00  Poligon1 EURUSD,M15: open #6 buy limit 1.00 EURUSD at 1.25623 sl: 1.25366 tp: 1.26023 ok
2013.03.01 12:11:21 2012.09.03 00:00  Poligon1 EURUSD,M15: open #5 buy 3.50 EURUSD at 1.25773 sl: 1.25616 tp: 1.25923 ok
2013.03.01 12:11:21 2012.09.03 00:00  Poligon1 EURUSD,M15: open #4 buy 2.50 EURUSD at 1.25773 sl: 1.25616 tp: 1.25923 ok
2013.03.01 12:11:21 2012.09.03 00:00  Poligon1 EURUSD,M15: open #3 buy 1.50 EURUSD at 1.25773 sl: 1.25616 tp: 1.25923 ok
2013.03.01 12:11:21 2012.09.03 00:00  Poligon1 EURUSD,M15: open #2 buy 1.00 EURUSD at 1.25773 sl: 1.25516 tp: 1.26023 ok
2013.03.01 12:11:21 2012.09.03 00:00  Poligon1 EURUSD,M15: open #1 buy 0.50 EURUSD at 1.25773 sl: 1.25416 tp: 1.26123 ok
2013.03.01 12:11:21 Poligon1 test started
2013.03.01 12:11:21 Poligon1 EURUSD,M15: loaded successfully

С уважением. Shurkin 

Всю вашу портянку не смотрел (прикреплять её нужно с использованием кнопочки SRC вверху над полем ввода) - неприятно ковыряться в размазанном по всей странице коде, но первое, что бросилось сразу в глаза - строчка for(i=0; i<OrdersTotal(); i++) . Для закрытия нужно использовать обратный цикл: for(i=OrdersTotal()-1; i>=0; i --)
 
Roger:
int x =MathRand() % 2;


А с чего бы то вдруг будет возвращаться 0 или 1, а не другое число? Ведь согласно справке функция MathRand() возвращает псевдослучайное целое число в дипазоне от 0 до 32767
 
hoz:

А с чего бы то вдруг будет возвращаться 0 или 1, а не другое число? Ведь согласно справке функция MathRand() возвращает псевдослучайное целое число в дипазоне от 0 до 32767

Это остаток от деления! Смотри в арифметических действиях и в своём принте!

Вставь и увидишь только два результата попеременно:

  int x =MathRand() % 2;
  Print("x =",x);
 
Приветствую всех! Подскажите, пожалуйста, как угомонить советник, при наступелении условий входа в рынок, он начинает писать в лог файл "Сработал приказ!" и делает это в минуту раз несколько десятков, в результате чего лог-файл становится космически огромным. Как сделать что бы писал только один раз, а не до закрытия позы, ведь она может провисеть и несколько часов...
 
Allis:
Приветствую всех! Подскажите, пожалуйста, как угомонить советник, при наступелении условий входа в рынок, он начинает писать в лог файл "Сработал приказ!" и делает это в минуту раз несколько десятков, в результате чего лог-файл становится космически огромным. Как сделать что бы писал только один раз, а не до закрытия позы, ведь она может провисеть и несколько часов...
Здрасьте, Аllis! Принт нужно прописать, где нет считывания по тикам! Я ставлю в принт, если есть ошибка, а если открылся, и так пропишется в журнале, что открылся, и только один раз!