Подскажете - как определить N последних убыточных ордеров. - страница 2

 
artmedia70:

Вы давно программируете для МТ4, 5 ?


Опыт программирования маленький. Поэтому не берусь утверждать что и как правильно, я просто показал то что увидел.
 

Вот скрипт считает количество убыточных из N просматривает всю историю и выбирает по датам


//+---------------------------------------------------+
//| Выбор ордеров из истории       С-Проба-Ордера.mq4 |
//+---------------------------------------------------+
#property strict

#define N 5  // Количество искомых ордеров

// Структура информации об ордерах
struct Ордера
{
   int      Номер;
   datetime ВремяЗакрытия;
   double   Профит;
};
Ордера Ордер[N];

enum Тип // 6 типов ордеров, а нам из них нужны два
{
            ПОКУПКА,        // 0 = BUY
            ПРОДАЖА,        // 1 = SELL
            ПОКУПКА_ЛИМИТ,  // 2 = BUY-LIMIT
            ПРОДАЖА_ЛИМИТ,  // 3 = SELL-LIMIT
            ПОКУПКА_СТОП,   // 4 = BUY-STOP
            ПРОДАЖА_СТОП    // 5 = SELL-STOP
};


void OnStart()
{   
   string Результат1="",Результат2="",Результат3=""; // Отладочная информация
   datetime Время;                                   // Время закрытия ордера
   int Счет, Счетчик, Количество=0;

   for(Счетчик=0; Счетчик<N; Счетчик++) Ордер[Счетчик].ВремяЗакрытия=0;
   int Всего=OrdersHistoryTotal();    // Всего ордеров в истории
   Alert("Всего ордеров в истории = ",Всего);

   for(int i=Всего-1; i>=0; i--)
   {
      if(!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;
      if(OrderType()>ПРОДАЖА) continue;
      Время=OrderCloseTime();                   // Берем время очередного ордера
      for(Счетчик=0; Счетчик<N; Счетчик++)      // Просматриваем массив структур
      if(Время>Ордер[Счетчик].ВремяЗакрытия)    // Если нашли в массиве более старый ордер
      {
         for(Счет=N-1; Счет>Счетчик; Счет--)    //    то сдвигаем все следующие на 1 позицию к концу
         {
            Ордер[Счет].Номер=Ордер[Счет-1].Номер;
            Ордер[Счет].ВремяЗакрытия=Ордер[Счет-1].ВремяЗакрытия;
            Ордер[Счет].Профит=Ордер[Счет-1].Профит;
         }
         Ордер[Счетчик].Номер=OrderTicket();    // а в массив на место найденного помещаем новый
         Ордер[Счетчик].ВремяЗакрытия=OrderCloseTime();
         Ордер[Счетчик].Профит=OrderProfit();
         break;                                 // Выход из цикла просмотра массива
      }
   }

   // Вывод отладочной информации в алерты
   for(Счетчик=0; Счетчик<N; Счетчик++)
   Результат1+=string(Ордер[Счетчик].Номер)+"                ";
   Alert(Результат1);
   
   for(Счетчик=0; Счетчик<N; Счетчик++)
   Результат2+=string(Ордер[Счетчик].ВремяЗакрытия)+"   ";
   Alert(Результат2);
   
   for(Счетчик=0; Счетчик<N; Счетчик++)
   Результат3+=string(Ордер[Счетчик].Профит)+"                           ";
   Alert(Результат3);

   for(Счетчик=0; Счетчик<N; Счетчик++)
   if(Ордер[Счетчик].Профит<0)Количество++;
   Alert("Количество убыточных  ",Количество, "  из  ", N);
}
 
LRA:

Вот скрипт считает количество убыточных из N просматривает всю историю и выбирает по датам


Сейчас пытаюсь разобраться со Структурами, пока идет тяжеловато.

 

#define N 5  // Количество искомых ордеров

 Эта строчка обозначает что N=5 ? И насколько я понял #define означает что значение N может меняться или ?

 for(Счетчик=0; Счетчик<N; Счетчик++) Ордер[Счетчик].ВремяЗакрытия=0;- Не получается понять данную строчку.

 .ВремяЗакрытия=0 - данная запись дает доступ к значению ВремяЗакрытия структуры Ордера и присваиваем ему значение 0.

А вот как вяжется с Массивом Ордер[Счетчик] не могу понять.

 for(Счетчик=0; Счетчик<N; Счетчик++) - непонятно что и для чего перебирает, т.к у него нет тела {}

 if(OrderType()>ПРОДАЖА) continue; - данная строчка по моему с ошибкой написана, т.к >ПРОДАЖА это отложенные ордера а значит должно быть так <=ПРОДАЖА ?!

А вот что пошло ниже моя голова пока отказывается понимать. Буду пробовать заменять такие значения как Счет на привычные для меня  j, если после этого то же не пойму буду еще задавать вопросы )

А так огромное спасибо, очень грамотно ! 

 
Оставь докурить
 


Для моего понимания я вставил коментарии напротив строчек, правильны ли они:

1) for(Счетчик=0; Счетчик<N; Счетчик++) Ордер[Счетчик].ВремяЗакрытия=0; - в данной строчке всем переменным ВремяЗакрытия от 0 до 4 ты присвоил значение "ноль"  ?

2)  for(int i=Всего-1; i>=0; i--) - перебираем все найденные ордера в истории.

   {

      if(!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue; - если найденный ордер не из истории переходим к следующей итерации.

      if(OrderType()>ПРОДАЖА) continue; - если тип найденного ордер отложенный, переходим к следующей итерации.

      Время=OrderCloseTime();                   // Берем время очередного ордера - определяет время закрытия каждого перебираемого ордера.

      for(Счетчик=0; Счетчик<N; Счетчик++)      // Просматриваем массив структур - перебирает найденные ордера ?

      if(Время>Ордер[Счетчик].ВремяЗакрытия)    // Если нашли в массиве более старый ордер - сравниваем время закрытия каждого найденного ордера между ордерами от 0 до 4 ?

      {

         for(Счет=N-1; Счет>Счетчик; Счет--)    //    то сдвигаем все следующие на 1 позицию к концу - перебираем от 4 до 1 найденные ордера

         {

            Ордер[Счет].Номер=Ордер[Счет-1].Номер; - делаем смещение на -1 

            Ордер[Счет].ВремяЗакрытия=Ордер[Счет-1].ВремяЗакрытия; - делаем смещение на -1 

            Ордер[Счет].Профит=Ордер[Счет-1].Профит; - делаем смещение на -1 

         }

         Ордер[Счетчик].Номер=OrderTicket();    // а в массив на место найденного помещаем новый - присваиваем значения перебираемым найденным ордерам.

         Ордер[Счетчик].ВремяЗакрытия=OrderCloseTime();  - присваиваем значения перебираемым найденным ордерам.

         Ордер[Счетчик].Профит=OrderProfit();  - присваиваем значения перебираемым найденным ордерам.

         break;                                 // Выход из цикла просмотра массива

      }

   }


 Напиши номер сбербанковской карты я тебе завтра сброшу сумму в качестве благодарности.

 

LRA:

Вопрос касательно тестирования. Я сколько не пытался тестировать на истории, скачивал историю с разных источников и.т.д  Всегда в итоге оказывалось что история кривая. Насколько я понял что на истории тестировать нельзя ?! Имеет смысл тестировать только в реальном времени хотя бы на протяжении месяца или двух ? Как ты делаешь тестирование и насколько можно доверять результатам тестирования ?

 Из-за проблем с историей нельзя сказать насколько стратегия входа в рынок эффективна, от сюда вопрос, как проверять стратегию, что бы быть уверенным в результатах ?!

 
Rafting: ... как проверять стратегию, что бы быть уверенным врезультатах ?! 
на практике. 
Причина обращения: