[WARNUNG GESCHLOSSEN!] Alle Fragen von Neulingen, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Ohne dich kann ich nirgendwo hingehen. - Seite 547

 
drknn >>:

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

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

Nächste. Verfolgung der Ereignisse, die seit der Ankunft der neuen Zecke eingetreten sind:

//--------------------------------------------------------------- 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, мы опять возвращаемся в точку отсчёта. Првое и самое главное - это алгоритм. То есть то, как должна работать программа. Если нет чёткого представления, то нет и программы, ибо нельзя сделать код, который не знаю как должен работать.

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


Informationsfunktion zur Anzeige von Meldungen im leeren 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 --

... und sogar der Indikator selbst:

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

Ich persönlich habe bereits "... ...mein ganzes Hirn ist in Stücke gerissen, alle meine Zöpfe sind geflochten und die kanadischen Behörden geben mir eine zweite Spritze..."
Ich kann den Fehler nicht finden... Ich bin noch nicht ganz so weit... :)

 

Gravitus писал(а) >>

...Ich plane, OrderMagicNumber() zu verwenden, um eine eingebaute Funktion zu machen, um es für jede spezifische Kerze zu berechnen, so dass es wünschenswert ist, dass jede Kerze und jeder Zeitrahmen einzigartig sind...Wie kann man es besser implementieren?

Wir haben zum Beispiel die Funktion, eine Magie automatisch nach EA-Name, Symbol und TF zu bilden. Nach dem gleichen Prinzip kann man aus allem einen Zauberer machen.

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

 
Meine Herren, Experten! Können Sie mir sagen, ob ich in der Konstruktion

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

Verwendung expliziter Werte anstelle von PERIOD_M5? In diesem Beispiel ist es 5:

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

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

 
Andrei01 >>:

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

Verdammt, ich arbeite an einem Projekt, für das keine 2 GB Arbeitsspeicher zur Verfügung stehen.

Und psychologisch bin ich durchaus in der Lage, mit "härteren Dingen" umzugehen, eben weil sie nicht den Schwachsinn enthalten, den Sie so leidenschaftlich vertreten.

 
granit77 schrieb >>

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

>> Danke.
 

artmedia70 Ich habe nur über einen Teil des Codes gesprochen, der nicht richtig funktioniert, nicht über den Code im Allgemeinen.

Niemand mag es, sich in den Code anderer Leute zu vertiefen. Ganz einfach, weil der Code eines anderen zunächst einmal ein Kryptogramm ist, das noch gelöst werden muss. Aus diesem Grund reagieren die Programmierer in diesem Forum nur sehr ungern auf Anfragen wie "Reparieren Sie den Indikator (Expert Advisor)".

 
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 бар

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


Der Typ PERIOD_XX ist eine ganze Zahl (int), wo liegt das Problem?

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

Константа Значение Описание 
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 Период текущего графика 
 
Was ist der Fehler 4051 und wie kann ich ihn beheben?
 
drknn >>:

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

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

Wer kann schon sagen, dass dieses Stück Code nicht korrekt funktioniert? Wenn ich den ganzen Code posten würde, gäbe es nicht genug Platz...
Erst forderst du mich heraus, dann versteckst du dich in den Büschen... :)
Grund der Beschwerde: