[경고, 주제 닫힘!] 포럼을 어지럽히지 않도록 모든 초보자 질문. 프로, 놓치지 마세요. 당신 없이는 어디에도 없습니다. - 페이지 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, 다시 출발점으로 돌아왔습니다. 첫 번째이자 가장 중요한 것은 알고리즘입니다. 그것이 프로그램이 작동하는 방식입니다. 명확한 아이디어가 없으면 프로그램이 없는 것입니다. 어떻게 작동해야 하는지 모르는 코드를 만들 수 없기 때문입니다.

올바르게 작동하지 않는 코드를 한 줄씩 살펴보겠습니다. 그냥 다 부숴 봅시다. 즉, 여기에서 이 특정 방법, 도구, 접근 방식을 사용하는 이유를 매우 정확하게 정당화할 수 있습니다. 하지만? (이것은 대중을 위한 작업이 아닙니다. 이것은 자신을 이해하기 위한 시도입니다. 프로그래밍은 먼저 명상이고, 그 다음 볼트, 너트, 은못, 머리핀 및 기타 작은 것들과 연결된 많은 세부 사항입니다). 행위?


빈 알림 표시기의 창에 메시지를 표시하는 정보 기능:

 //--------------------------------------------------------------- 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()를 사용하여 특정 양초에 대해 계산하는 내장 함수를 만들 계획이므로 각 양초 및 TF에 대해 고유한 것이 바람직합니다. ... 그것을 구현하는 가장 좋은 방법은 무엇입니까?

예를 들어 - 고문, 기호 및 TF의 이름으로 마술사 자동 형성 기능. 같은 원리로 마법은 무엇이든 만들 수 있습니다.

 //+----------------------------------------------------------------------------+
//|  Автор    : 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 >> :

글쎄요, 스스로 생각해 보세요. 정보가 여러 장에 흩어져 있으면 정보를 처리하는 것이 심리적으로 어렵습니다. 전체 그림을 분석하려면 코드를 계속 앞뒤로 뒤집어야 합니다. 그러나 사람은 이것을 하는 토끼도 아니고 개구리도 아닙니다. 물론 코드가 세 줄로 구성된 경우에는 해당되지 않지만, 샷이 더 복잡합니다.

젠장, 2GB의 메모리가 부족하여 함께 작업할 수 있는 프로젝트를 진행 중입니다.

그리고 심리적으로, 나는 당신이 그토록 열렬히 옹호하는 헛소리가 없다는 사실 때문에 정확하게 "더 복잡한 쇼토"를 완벽하게 처리합니다.

 
granit77 작성 >>

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

감사하다.
 

artmedia70 , 일반적으로 전체 코드가 아니라 올바르게 작동하지 않는 코드 부분에 대해서만 이야기했습니다.

아무도 다른 사람의 코드를 파헤치는 것을 좋아하지 않습니다. 다른 사람의 코드는 무엇보다도 아직 풀어야 할 암호이기 때문입니다. 이것이 이 포럼의 프로그래머들이 "지표 수정(EA)"과 같은 요청에 응답하는 것을 매우 꺼리는 이유입니다.

 
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 유형이 정수(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 , 일반적으로 전체 코드가 아니라 올바르게 작동하지 않는 코드 부분에 대해서만 이야기했습니다.

아무도 다른 사람의 코드를 파헤치는 것을 좋아하지 않습니다. 다른 사람의 코드는 무엇보다도 아직 풀어야 할 암호이기 때문입니다. 이것이 이 포럼의 프로그래머들이 "지표 수정(EA)"과 같은 요청에 응답하는 것을 매우 꺼리는 이유입니다.

그리고 정확히 그 부분이 제대로 작동하지 않는다고 누가 말했습니까? 모든 코드를 게시하면 공간이 충분하지 않을 것입니다 ...
먼저 의사 소통을 요청한 다음 덤불에서 ... :)