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 ( intnew = 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 --
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; // Цвет строки сообщенияstaticint Time_Mess; // Время последней публикации сообщ.staticint Nom_Mess_Graf; // Счётчик графических сообщенийstaticstring 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) // Переход на сообщение
{
case1 :
Graf_Text= "Закрыт ордер Buy " + Number;
PlaySound ( "Close_order.wav" ); break ;
case2 :
Graf_Text= "Закрыт ордер Sell " + Number;
PlaySound ( "Close_order.wav" ); break ;
case3 :
Graf_Text= "Удалён отложенный ордер " + Number;
PlaySound ( "Close_order.wav" ); break ;
case4 :
Graf_Text= "Открыт ордер Buy " + Number;
PlaySound ( "Ok.wav" ); break ;
case5 :
Graf_Text= "Открыт ордер Sell " + Number;
PlaySound ( "Ok.wav" ); break ;
case6 :
Graf_Text= "Установлен отложенный ордер " + Number;
PlaySound ( "Ok.wav" ); break ;
case7 :
Graf_Text= "Ордер " +Number+ " преобразовался в рыночный" ;
PlaySound ( "Transform.wav" ); break ;
case8 :
Graf_Text= "Переоткрыт ордер " + Number; break ;
PlaySound ( "Bulk.wav" );
case9 :
Graf_Text= "Частично закрыт ордер " + Number;
PlaySound ( "Close_order.wav" ); break ;
case10 :
Graf_Text= "Новая минимальная дистанция: " + Number;
PlaySound ( "Inform.wav" ); break ;
case11 :
Graf_Text= " Не хватает денег на " +
DoubleToStr(Value, 2 ) + " лотов" ;
Color_GT= Red ;
PlaySound ( "Oops.wav" ); break ;
case12 :
Graf_Text= "Пробуем закрыть ордер " + Number;
PlaySound ( "expert.wav" ); break ;
case13 :
if (Number> 0 )
Graf_Text= "Пробуем открыть ордер Sell.." ;
else
Graf_Text= "Пробуем открыть ордер Buy.." ;
PlaySound ( "expert.wav" ); break ;
case14 :
Graf_Text= "Неправильный пароль. Эксперт не работает." ;
Color_GT= Red ;
PlaySound ( "Oops.wav" ); break ;
case15 :
switch (Number) // Переход на номер ошибки
{
case2 : Graf_Text= "Общая ошибка." ; break ;
case129 : Graf_Text= "Неправильная цена. " ; break ;
case135 : Graf_Text= "Цена изменилась. " ; break ;
case136 : Graf_Text= "Нет цен. Ждём новый тик.." ; break ;
case146 : Graf_Text= "Подсистема торговли занята" ; break ;
case5 : Graf_Text= "Старая версия терминала." ; break ;
case64 : Graf_Text= "Счет заблокирован." ; break ;
case133 : Graf_Text= "Торговля запрещена" ; break ;
default : Graf_Text= "Возникла ошибка " + Number; //Другие
}
Color_GT= Red ;
PlaySound ( "Error.wav" ); break ;
case16 :
Graf_Text= "Эксперт работает только на EURUSD" ;
Color_GT= Red ;
PlaySound ( "Oops.wav" ); break ;
case17 :
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 --
...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 ());
글쎄요, 스스로 생각해 보세요. 정보가 여러 장에 흩어져 있으면 정보를 처리하는 것이 심리적으로 어렵습니다. 전체 그림을 분석하려면 코드를 계속 앞뒤로 뒤집어야 합니다. 그러나 사람은 이것을 하는 토끼도 아니고 개구리도 아닙니다. 물론 코드가 세 줄로 구성된 경우에는 해당되지 않지만, 샷이 더 복잡합니다.
젠장, 2GB의 메모리가 부족하여 함께 작업할 수 있는 프로젝트를 진행 중입니다.
그리고 심리적으로, 나는 당신이 그토록 열렬히 옹호하는 헛소리가 없다는 사실 때문에 정확하게 "더 복잡한 쇼토"를 완벽하게 처리합니다.
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_M111 минута
PERIOD_M555 минут
PERIOD_M151515 минут
PERIOD_M303030 минут
PERIOD_H1601 час
PERIOD_H42404 часа
PERIOD_D114401 день
PERIOD_W1100801 неделя
PERIOD_MN1432001 месяц
0 (ноль) 0 Период текущего графика
artmedia70, 다시 출발점으로 돌아왔습니다. 첫 번째이자 가장 중요한 것은 알고리즘입니다. 그것이 프로그램이 작동하는 방식입니다. 명확한 아이디어가 없으면 프로그램이 없는 것입니다. 어떻게 작동해야 하는지 모르는 코드를 만들 수 없기 때문입니다.
올바르게 작동하지 않는 코드를 한 줄씩 살펴보겠습니다. 그냥 다 부숴 봅시다. 즉, 여기에서 이 특정 방법, 도구, 접근 방식을 사용하는 이유를 매우 정확하게 정당화할 수 있습니다. 하지만? (이것은 대중을 위한 작업이 아닙니다. 이것은 자신을 이해하기 위한 시도입니다. 프로그래밍은 먼저 명상이고, 그 다음 볼트, 너트, 은못, 머리핀 및 기타 작은 것들과 연결된 많은 세부 사항입니다). 행위?
더 나아가. 새 틱의 도착과 함께 발생한 이벤트 추적:
artmedia70, 다시 출발점으로 돌아왔습니다. 첫 번째이자 가장 중요한 것은 알고리즘입니다. 그것이 프로그램이 작동하는 방식입니다. 명확한 아이디어가 없으면 프로그램이 없는 것입니다. 어떻게 작동해야 하는지 모르는 코드를 만들 수 없기 때문입니다.
올바르게 작동하지 않는 코드를 한 줄씩 살펴보겠습니다. 그냥 다 부숴 봅시다. 즉, 여기에서 이 특정 방법, 도구, 접근 방식을 사용하는 이유를 매우 정확하게 정당화할 수 있습니다. 하지만? (이것은 대중을 위한 작업이 아닙니다. 이것은 자신을 이해하기 위한 시도입니다. 프로그래밍은 먼저 명상이고, 그 다음 볼트, 너트, 은못, 머리핀 및 기타 작은 것들과 연결된 많은 세부 사항입니다). 행위?
빈 알림 표시기의 창에 메시지를 표시하는 정보 기능:
... 그리고 실제로 지표 자체:
개인적으로, 나는 이미 "... 내 모든 두뇌를 조각으로 부수고 모든 회선을 땋고 캐나다 당국이 나에게 두 번째 주사를 주사 ..."
오타가 없네요.. 아직 성숙하지 못해서... :)
Gravitus писал(а) >>
...OrderMagicNumber()를 사용하여 특정 양초에 대해 계산하는 내장 함수를 만들 계획이므로 각 양초 및 TF에 대해 고유한 것이 바람직합니다. ... 그것을 구현하는 가장 좋은 방법은 무엇입니까?
예를 들어 - 고문, 기호 및 TF의 이름으로 마술사 자동 형성 기능. 같은 원리로 마법은 무엇이든 만들 수 있습니다.
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 바
?????????????????????
글쎄요, 스스로 생각해 보세요. 정보가 여러 장에 흩어져 있으면 정보를 처리하는 것이 심리적으로 어렵습니다. 전체 그림을 분석하려면 코드를 계속 앞뒤로 뒤집어야 합니다. 그러나 사람은 이것을 하는 토끼도 아니고 개구리도 아닙니다. 물론 코드가 세 줄로 구성된 경우에는 해당되지 않지만, 샷이 더 복잡합니다.
젠장, 2GB의 메모리가 부족하여 함께 작업할 수 있는 프로젝트를 진행 중입니다.
그리고 심리적으로, 나는 당신이 그토록 열렬히 옹호하는 헛소리가 없다는 사실 때문에 정확하게 "더 복잡한 쇼토"를 완벽하게 처리합니다.
Для примера - функция автоформирования магика по имени советника, символу и ТФ. По этому же принципу магик можно создать из чего угодно.
artmedia70 , 일반적으로 전체 코드가 아니라 올바르게 작동하지 않는 코드 부분에 대해서만 이야기했습니다.
아무도 다른 사람의 코드를 파헤치는 것을 좋아하지 않습니다. 다른 사람의 코드는 무엇보다도 아직 풀어야 할 암호이기 때문입니다. 이것이 이 포럼의 프로그래머들이 "지표 수정(EA)"과 같은 요청에 응답하는 것을 매우 꺼리는 이유입니다.
Господа, знатоки! Подскажите, могу ли я в конструкции
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)입니다. 무엇이 문제인가요?
artmedia70 , 일반적으로 전체 코드가 아니라 올바르게 작동하지 않는 코드 부분에 대해서만 이야기했습니다.
아무도 다른 사람의 코드를 파헤치는 것을 좋아하지 않습니다. 다른 사람의 코드는 무엇보다도 아직 풀어야 할 암호이기 때문입니다. 이것이 이 포럼의 프로그래머들이 "지표 수정(EA)"과 같은 요청에 응답하는 것을 매우 꺼리는 이유입니다.
먼저 의사 소통을 요청한 다음 덤불에서 ... :)