[ВНИМАНИЕ, ТЕМА ЗАКРЫТА!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда. - страница 547

 
drknn >>:

artmedia70, мы опять возвращаемся в точку отсчёта. Првое и самое главное - это алгоритм. То есть то, как должна работать программа. Если нет чёткого представления, то нет и программы, ибо нельзя сделать код, который не знаю как должен работать.

Давайте по-строчкам разберём кусочек Вашего кода, который работает не правильно. Только давайте разберём всё от и до. То есть, Вы будете предельно точным в обосновании почему Вы задействуете в этом месте именно этот способ, инструмент, подход. А? (Это не работа на публику - это попытка разобраться в самом себе - программинг - это сначала медитация, потом - кучка деталек, связанных болтиками, гаечками, шпонками, шпильками и прочей мелочёвкой). Делаем?

Далее. Отслеживание событий, произошедших с приходом нового тика:

//--------------------------------------------------------------- 1 --
// Функция слежения за событиями.
// Глобальные переменные:
// Level_new            Новое значение минимальной дистанции
// Level_old            Предыдущее значение минимальной дистанции
// Mas_Ord_New[16][31][10]   Массив ордеров последний известный
// Mas_Ord_Old[16][31][10]   Массив ордеров предыдущий (старый)
//--------------------------------------------------------------- 2 --
int Events()                              // Пользовательская функция
  {
   bool Conc_Nom_Ord;                     // Совпадение ордеров в ..
                                          //.. старом и новом массивах
//--------------------------------------------------------------- 3 --
//   Level_new=MarketInfo(Symbol(),MODE_STOPLEVEL ); // Последн.известное
//   if (Level_old!=Level_new)                       // Новое не равно старому..
//     {                                             // значит изменились условия
//      Level_old=Level_new;                         // Новое "старое значение"
//      Inform(10,Level_new);                        // Сообщение: новая дистанц.
//     }
// Выше - то, что было изначально в коде.
// Тут наверное нужно организовать цикл по всем валютным парам, чтобы иметь информацию по каждой паре
// об изменении минимальной дистанции SL, TP, спред, ну и т.д. ...
// Данные брать из Mas_Ord_Old [0] [Номер вал. инструм.] [данные ДЦ]. Например так:
//----------------------------------------------------------------------------------------------------

   for (int ln=1; ln<=Instr_Count; ln++)                       // Поиск по массиву вал. инструментов
       {
         for (int mode=1; mode<=9; mode++)                     // Цикл по режимам MarketInfo вал. инструмента, 
            {                                                  // равного текущему значению ln
               Level_old=Mas_Ord_Old[0][ln][mode];             // Берём значение из массива Mas_Ord_Old [0][символ инстр.][MODE=mode]      
               Level_new=MarketInfo(Instrument[ln],mode+10);   // Берём то же значение у ДЦ 
                                                               // Здесь Instrument[ln] в соответствии с массивом названий вал. инстр.
                                                               // возвращает название по значению ln, далее 
                                                               // к значению mode прибавляем 10 и молучаем MODE_XXX)
            
                  if (Level_old!=Level_new)                    // Если данные ДЦ изменились
                        {
                           Level_old=Level_new;                // Запоминаем новое значение Level_new в Level_old,
                           Mas_Ord_New[0][ln][mode]=Level_new; // заносим его в массив Mas_Ord_New
                           Inform(10,Level_new);               // Сообщаем об изменениях у брокера
                                                               // Функцию тоже нужно дорабатывать для более информативных сообщений...
                        }
            }                                                  // Если данные ДЦ по данному режиму не поменялись, повторяем
                                                               // цикл по следующему режиму. До mode=9
            
       }                                                       // Проверили все MODE по данной валютной паре, переходим к следующей
        
//--------------------------------------------------------------- 4 --
   // Поиск пропавших, поменявших тип, частично закрытых и переоткрытых
   
   // Данная функция работает с двумерным массивом данных только по одному валютному инструменту.
   // Мне же необходимо учитывать ещё и различные валютные инструменты
   // Попробуем так:
   
for (int instrum=1;instrum<=Instr_Count;instrum++)             // Цикл по всем валютным инструментам.
                                                               // Кол-во используемых инструментов задаётся переменной Instr_Count
   {                                                            
   
   for(int old=1;old<=Mas_Ord_Old[instrum][0][0];old++)     // По массиву старых
     {                                             // Исходим из того, что..
      Conc_Nom_Ord=false;                          // ..ордера не совпадают
      //--------------------------------------------------------- 5 --
      for(int new=1;new<=Mas_Ord_New[instrum][0][0];new++)  //Цикл по массиву ..
        {                                          //..новых ордеров
         //------------------------------------------------------ 6 --
         if (Mas_Ord_Old[instrum][old][4]==Mas_Ord_New[instrum][new][4])// Совпал номер 
           {                              // Тип ордера стал ..
            if (Mas_Ord_New[instrum][new][6]!=Mas_Ord_Old[instrum][old][6])//.. другим
               Inform(7,Mas_Ord_New[instrum][new][4]);// Сообщение: преобраз.:)
            Conc_Nom_Ord=true;            // Ордер найден, ..
            break;                        // ..значит выходим из ..
           }                              // .. внутреннего цикла
         //------------------------------------------------------ 7 --
                                          // Не совпал номер ордера
         if (Mas_Ord_Old[instrum][old][7]>0 &&     // MagicNumber есть, совпал
            Mas_Ord_Old[instrum][old][7]==Mas_Ord_New[instrum][new][7])//.. со старым
           {               //значит он переоткрыт или частично закрыт
                                             // Если лоты совпадают,.. 
            if (Mas_Ord_Old[instrum][old][5]==Mas_Ord_New[instrum][new][5])
               Inform(8,Mas_Ord_Old[instrum][old][4]);// ..то переоткрытие
            else                             // А иначе это было.. 
               Inform(9,Mas_Ord_Old[instrum][old][4]);// ..частичное закрытие
            Conc_Nom_Ord=true;               // Ордер найден, ..
            break;                           // ..значит выходим из ..
           }                                 // .. внутреннего цикла
        }
      //--------------------------------------------------------- 8 --
      if (Conc_Nom_Ord==false)               // Если мы сюда дошли,..
        {                                    // ..то ордера нет:(
         if (Mas_Ord_Old[instrum][old][6]==0)
            Inform(1, Mas_Ord_Old[instrum][old][4]);  // Ордер Buy закрыт
         if (Mas_Ord_Old[instrum][old][6]==1)
            Inform(2, Mas_Ord_Old[instrum][old][4]);  // Ордер Sell закрыт
         if (Mas_Ord_Old[instrum][old][6]> 1)
            Inform(3, Mas_Ord_Old[instrum][old][4]);  // Отложен. ордер удалён
        }
     }
   }   // Конец итерации по валютному инструменту  
//--------------------------------------------------------------- 9 --
   // Поиск новых ордеров 
   for(new=1; new<=Mas_Ord_New[instrum][0][0]; new++)// По массиву новых орд.
     {
      if (Mas_Ord_New[instrum][new][8]>0)            //Это не новый,а переоткр
         continue;                          //..или частично закрытый
      Conc_Nom_Ord=false;                   // Пока совпадения нет
      for(old=1; old<=Mas_Ord_Old[instrum][0][0]; old++)// Поищем этот ордерок 
        {                                   // ..в массиве старых
         if (Mas_Ord_New[instrum][new][4]==Mas_Ord_Old[instrum][old][4])//Совпал номер..
           {                                          //.. ордера
            Conc_Nom_Ord=true;              // Ордер найден, ..
            break;                          // ..значит выходим из ..
           }                                // .. внутреннего цикла
        }
      if (Conc_Nom_Ord==false)              // Если совпадения нет,..
        {                                   // ..то ордер новый :)
         if (Mas_Ord_New[instrum][new][6]==0)
            Inform(4, Mas_Ord_New[instrum][new][4]); // Ордер Buy открыт
         if (Mas_Ord_New[instrum][new][6]==1)
            Inform(5, Mas_Ord_New[instrum][new][4]); // Ордер Sell открыт
         if (Mas_Ord_New[instrum][new][6]> 1)
            Inform(6, Mas_Ord_New[instrum][new][4]); // Установлен отлож.ордер
        }
     }
//-------------------------------------------------------------- 10 --
   return;
  }
//-------------------------------------------------------------- 11 --
 
drknn >>:

artmedia70, мы опять возвращаемся в точку отсчёта. Првое и самое главное - это алгоритм. То есть то, как должна работать программа. Если нет чёткого представления, то нет и программы, ибо нельзя сделать код, который не знаю как должен работать.

Давайте по-строчкам разберём кусочек Вашего кода, который работает не правильно. Только давайте разберём всё от и до. То есть, Вы будете предельно точным в обосновании почему Вы задействуете в этом месте именно этот способ, инструмент, подход. А? (Это не работа на публику - это попытка разобраться в самом себе - программинг - это сначала медитация, потом - кучка деталек, связанных болтиками, гаечками, шпонками, шпильками и прочей мелочёвкой). Делаем?


Информационная функция, выводящая сообщения в окно пустого индикатора Inform:

//--------------------------------------------------------------- 1 --
// Функция вывода на экран графических сообщений.
//--------------------------------------------------------------- 2 --
int Inform(int Mess_Number, int Number=0, double Value=0.0)
  {
   // int    Mess_Number               // Номер сообщения  
   // int    Number                    // Передаваемое целое значение
   // double Value                     // Передаваемое действит. знач.
   int    Win_ind;                     // Номер окна индикатора
   string Graf_Text;                   // Строка сообщения
   color  Color_GT;                    // Цвет строки сообщения
   static int    Time_Mess;            // Время последней публикации сообщ.
   static int    Nom_Mess_Graf;        // Счётчик графических сообщений
   static string Name_Grf_Txt[30];     // Массив имён графич. сообщений
//--------------------------------------------------------------- 3 --
   Win_ind= WindowFind("Inform");      // Ищем номер окна индикатора
   if (Win_ind<0)return;               // Если такого окна нет, уходим
//--------------------------------------------------------------- 4 --


   if (Mess_Number==0)                 // Это происходит в каждом тике
     {
      if (Time_Mess==0) return;        // Если уже крашено серым
      if (GetTickCount()-Time_Mess>15000)// За 15 сек цвет устарел
        {
         for(int i=0;i<=29; i++)       // Красим cтроки серым
            ObjectSet( Name_Grf_Txt[i], OBJPROP_COLOR, DarkGray);
         Time_Mess=0;                  // Флажок: все строки серые
         WindowRedraw();               // Перерисовываем объекты
        }
      return;                          // Выход из функции
     }
//--------------------------------------------------------------- 5 --
   if (Mess_Number==-1)                // Это происходит при deinit()
     {
      for(i=0; i<=29; i++)             // По индексам объектов
         ObjectDelete(Name_Grf_Txt[i]);// Удаление объекта
      return;                          // Выход из функции
     }
//--------------------------------------------------------------- 6 --
   Nom_Mess_Graf++;                    // Счётчик графических сообщ.
   Time_Mess=GetTickCount();           // Время последней публикации 
   Color_GT=Lime;
//--------------------------------------------------------------- 7 --
   switch(Mess_Number)                 // Переход на сообщение
     {
      case 1:
         Graf_Text="Закрыт ордер Buy "+ Number;
         PlaySound("Close_order.wav");                         break;
      case 2:
         Graf_Text="Закрыт ордер Sell "+ Number;
         PlaySound("Close_order.wav");                         break;
      case 3:
         Graf_Text="Удалён отложенный ордер "+ Number;
         PlaySound("Close_order.wav");                         break;
      case 4:
         Graf_Text="Открыт ордер Buy "+ Number;
         PlaySound("Ok.wav");                                  break;
      case 5:
         Graf_Text="Открыт ордер Sell "+ Number;
         PlaySound("Ok.wav");                                  break;
      case 6:
         Graf_Text="Установлен отложенный ордер "+ Number;
         PlaySound("Ok.wav");                                  break;
      case 7:
         Graf_Text="Ордер "+Number+" преобразовался в рыночный";
         PlaySound("Transform.wav");                           break;
      case 8:
         Graf_Text="Переоткрыт ордер "+ Number;                break;
         PlaySound("Bulk.wav");
      case 9:
         Graf_Text="Частично закрыт ордер "+ Number;
         PlaySound("Close_order.wav");                         break;
      case 10:
         Graf_Text="Новая минимальная дистанция: "+ Number;
         PlaySound("Inform.wav");                              break;
      case 11:
         Graf_Text=" Не хватает денег на "+
         DoubleToStr(Value,2) + " лотов";
         Color_GT=Red;
         PlaySound("Oops.wav");                                break;
      case 12:
         Graf_Text="Пробуем закрыть ордер "+ Number;
         PlaySound("expert.wav");                              break;
      case 13:
         if (Number>0)
            Graf_Text="Пробуем открыть ордер Sell..";
         else
            Graf_Text="Пробуем открыть ордер Buy..";
         PlaySound("expert.wav");                              break;
      case 14:
         Graf_Text="Неправильный пароль. Эксперт не работает.";
         Color_GT=Red;
         PlaySound("Oops.wav");                                break;
      case 15:
         switch(Number)                                                 // Переход на номер ошибки
           {
            case 2:   Graf_Text="Общая ошибка.";             break;
            case 129: Graf_Text="Неправильная цена. ";       break;
            case 135: Graf_Text="Цена изменилась. ";         break;
            case 136: Graf_Text="Нет цен. Ждём новый тик.."; break;
            case 146: Graf_Text="Подсистема торговли занята";break;
            case 5 :  Graf_Text="Старая версия терминала.";  break;
            case 64:  Graf_Text="Счет заблокирован.";        break;
            case 133: Graf_Text="Торговля запрещена";        break;
            default:  Graf_Text="Возникла ошибка " + Number;            //Другие
           }
         Color_GT=Red;
         PlaySound("Error.wav");                               break;
      case 16:
         Graf_Text="Эксперт работает только на EURUSD";
         Color_GT=Red;
         PlaySound("Oops.wav");                                break;
         
      case 17:
         Graf_Text="Переменная Delta= "+ Value;
         PlaySound("Inform.wav");                              break;   
         
      default:
         Graf_Text="default "+ Mess_Number;
         Color_GT=Red;
         PlaySound("Bzrrr.wav");
     }
//--------------------------------------------------------------- 8 --
   ObjectDelete(Name_Grf_Txt[29]);      // 29й(верхний) объект удаляем
   for(i=29; i>=1; i--)                 // Цикл по индексам массива ..
     {                                 // .. графических объектов
      Name_Grf_Txt[i]=Name_Grf_Txt[i-1];// Поднимаем объекты:
      ObjectSet( Name_Grf_Txt[i], OBJPROP_YDISTANCE, 2+15*i);
     }
   Name_Grf_Txt[0]="Inform_"+Nom_Mess_Graf+"_"+Symbol(); // Имя объект
   ObjectCreate (Name_Grf_Txt[0],OBJ_LABEL, Win_ind,0,0);// Создаём
   ObjectSet    (Name_Grf_Txt[0],OBJPROP_CORNER, 3   );  // Угол
   ObjectSet    (Name_Grf_Txt[0],OBJPROP_XDISTANCE, 250);// Коорд. Х
   ObjectSet    (Name_Grf_Txt[0],OBJPROP_YDISTANCE, 2);  // Коорд. Y
   // Текстовое описание объекта
   ObjectSetText(Name_Grf_Txt[0],Graf_Text,10,"Courier New",Color_GT);
   WindowRedraw();                      // Перерисовываем все объекты
   return;
  }
//--------------------------------------------------------------- 9 --

... и, собственно, сам индюкатор:

//--------------------------------------------------------------------
#property indicator_separate_window // Отдельное окно индикатора
IndicatorShortName("Inform");
//--------------------------------------------------------------------
int start()                         // Специальная функция start()
  {
  }
//--------------------------------------------------------------------
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
{
   ObjectsDeleteAll();
   // удаляем все объекты
   
   return(0);
}

Лично я уже "... все мозги разбил на части, все извилины заплёл и канадчиковы власти колють мне второй укол..."
Не могу найти ошибку... Не дорос ещё... :)

 

Gravitus писал(а) >>

...планирую использовать OrderMagicNumber(), сделать встроенную функцию для вычисления его для каждой конкретной свечи, так вот желательно чтобы для каждой свечи и тф он был уникальным. ...как это лучше реализовать?

Для примера - функция автоформирования магика по имени советника, символу и ТФ. По этому же принципу магик можно создать из чего угодно.

//+----------------------------------------------------------------------------+
//|  Автор    : granit77, KimIV style                                          |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.04.2009                                                     |
//|  Описание : Возвращает сумму символьных кодов всех символов входной строки |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    simbolstring - строка для расчета                                       |
//|    multiplier   - дополнительный множитель                                 |
//+----------------------------------------------------------------------------+

int GetMagic(string simbolstring, int multiplier){
   int res=0;
   int len=StringLen(simbolstring);
   for(int i=0; i<len; i++)
       res+=StringGetChar(simbolstring,i);      
   return(res*multiplier);
}
//----------------

//Пример формирования магика в init
_comment=WindowExpertName();
Magic=GetMagic(_comment+Symbol(),Period());

 
Господа, знатоки! Подскажите, могу ли я в конструкции

MACDmn_0 =iMACD(NULL,PERIOD_M5,IND_Value1,IND_Value2,IND_Value3,PRICE_CLOSE,MODE_MAIN,0); // 0 бар

вместо PERIOD_M5 использовать явно заданные значения? В данном примере - 5:

MACDmn_0 =iMACD(NULL,5,IND_Value1,IND_Value2,IND_Value3,PRICE_CLOSE,MODE_MAIN,0); // 0 бар

?????????????????

 
Andrei01 >>:

Ну сами подумайте - психологически сложно обрабатывать информацию если она размазана на несколько листов - нужно постоянно прыгать туда-сюда листая код шоб анализировать всю картину. А ведь человек - не заяц и не лягушка шоб этим заниматься. Разумеется это не относится к случаям когда код состоит из трёх строчек, а шото посложней.

Млять, я работаю на проекте, которому 2ГБ памяти не хватает, чтобы собраться.

И психологически прекрасно обрабатываю "шото посложней" именно благодаря тому, что в нем нет быдлятины, за которую вы так яро ратуете.

 
granit77 писал(а) >>

Для примера - функция автоформирования магика по имени советника, символу и ТФ. По этому же принципу магик можно создать из чего угодно.

спасибо.
 

artmedia70, я говорил лишь о том кусочке кода, который работает не правильно, а не обо всём коде вообще.

Копаться в чужих кодах не любит ни кто. Просто потому, что чужой код - это прежде всего криптограмма, которую ещё нужно разгадать. Именно поэтому программисты на этом форуме весьм неохотно откликаются на просьбы типа "Исправьте индикатор (советника)".

 
artmedia70 >>:
Господа, знатоки! Подскажите, могу ли я в конструкции

MACDmn_0 =iMACD(NULL,PERIOD_M5,IND_Value1,IND_Value2,IND_Value3,PRICE_CLOSE,MODE_MAIN,0); // 0 бар

вместо PERIOD_M5 использовать явно заданные значения? В данном примере - 5:

MACDmn_0 =iMACD(NULL,5,IND_Value1,IND_Value2,IND_Value3,PRICE_CLOSE,MODE_MAIN,0); // 0 бар

?????????????????


Тип PERIOD_XX это integer (int), в чем проблема?

Период графика может быть любым из следующих величин:

Константа Значение Описание 
PERIOD_M1 1 1 минута 
PERIOD_M5 5 5 минут 
PERIOD_M15 15 15 минут 
PERIOD_M30 30 30 минут 
PERIOD_H1 60 1 час 
PERIOD_H4 240 4 часа 
PERIOD_D1 1440 1 день 
PERIOD_W1 10080 1 неделя 
PERIOD_MN1 43200 1 месяц 
0 (ноль) 0 Период текущего графика 
 
Что за ошибка 4051 и как её отлавливать?
 
drknn >>:

artmedia70, я говорил лишь о том кусочке кода, который работает не правильно, а не обо всём коде вообще.

Копаться в чужих кодах не любит ни кто. Просто потому, что чужой код - это прежде всего криптограмма, которую ещё нужно разгадать. Именно поэтому программисты на этом форуме весьм неохотно откликаются на просьбы типа "Исправьте индикатор (советника)".

А кто сказал, что именно тот кусочек работает неправильно? Если б я выложил весь код - места бы не хватило...
Сначала вызываете на общение, потом в кусты... :)
Причина обращения: