[警告关闭!]任何新手问题,为了不给论坛添乱。专业人士,不要走过。没有你,哪里都不能去。 - 页 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(),做一个内置函数,为每个特定的蜡烛计算,所以每个蜡烛和时间框架最好是唯一的。 ...如何更好地实现它?

例如,我们有通过EA名称、符号和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 bar

使用明确的值代替PERIOD_M5?在这个例子中,它是5

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

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

 
Andrei01 >>:

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

操,我正在做一个没有2GB内存的项目,要组装。

而在心理上,我完全有能力处理 "更难的东西",正是因为它不包含你所热衷的那些废话。

 
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类型是一个整数(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, я говорил лишь о том кусочке кода, который работает не правильно, а не обо всём коде вообще.

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

谁能说那段代码不能正确工作?如果我贴出所有的代码,空间就不够了......
你先是向我挑战,然后又跑到灌木丛中......。:)
原因: