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, мы опять возвращаемся в точку отсчёта. Првое и самое главное - это алгоритм. То есть то, как должна работать программа. Если нет чёткого представления, то нет и программы, ибо нельзя сделать код, который не знаю как должен работать.
Давайте по-строчкам разберём кусочек Вашего кода, который работает не правильно. Только давайте разберём всё от и до. То есть, Вы будете предельно точным в обосновании почему Вы задействуете в этом месте именно этот способ, инструмент, подход. А? (Это не работа на публику - это попытка разобраться в самом себе - программинг - это сначала медитация, потом - кучка деталек, связанных болтиками, гаечками, шпонками, шпильками и прочей мелочёвкой). Делаем?
空のInformにメッセージを表示するInformation機能。
//--------------------------------------------------------------- 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 --
...と、実はインジケーターそのものなのです。
//--------------------------------------------------------------------#property indicator_separate_window // Отдельное окно индикатора
IndicatorShortName("Inform");
//--------------------------------------------------------------------int start() // Специальная функция start()
{
}
//--------------------------------------------------------------------//+------------------------------------------------------------------+//| Custom indicator deinitialization function |//+------------------------------------------------------------------+int deinit()
{
ObjectsDeleteAll();
// удаляем все объектыreturn(0);
}
//+----------------------------------------------------------------------------+//| Автор : 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());
Ну сами подумайте - психологически сложно обрабатывать информацию если она размазана на несколько листов - нужно постоянно прыгать туда-сюда листая код шоб анализировать всю картину. А ведь человек - не заяц и не лягушка шоб этим заниматься. Разумеется это не относится к случаям когда код состоит из трёх строчек, а шото посложней.
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, мы опять возвращаемся в точку отсчёта. Првое и самое главное - это алгоритм. То есть то, как должна работать программа. Если нет чёткого представления, то нет и программы, ибо нельзя сделать код, который не знаю как должен работать.
Давайте по-строчкам разберём кусочек Вашего кода, который работает не правильно. Только давайте разберём всё от и до. То есть, Вы будете предельно точным в обосновании почему Вы задействуете в этом месте именно этот способ, инструмент, подход. А? (Это не работа на публику - это попытка разобраться в самом себе - программинг - это сначала медитация, потом - кучка деталек, связанных болтиками, гаечками, шпонками, шпильками и прочей мелочёвкой). Делаем?
次のページ新しいティックの到着以降に発生したイベントを追跡する。
artmedia70, мы опять возвращаемся в точку отсчёта. Првое и самое главное - это алгоритм. То есть то, как должна работать программа. Если нет чёткого представления, то нет и программы, ибо нельзя сделать код, который не знаю как должен работать.
Давайте по-строчкам разберём кусочек Вашего кода, который работает не правильно. Только давайте разберём всё от и до. То есть, Вы будете предельно точным в обосновании почему Вы задействуете в этом месте именно этот способ, инструмент, подход. А? (Это не работа на публику - это попытка разобраться в самом себе - программинг - это сначала медитация, потом - кучка деталек, связанных болтиками, гаечками, шпонками, шпильками и прочей мелочёвкой). Делаем?
空のInformにメッセージを表示するInformation機能。
...と、実はインジケーターそのものなのです。
個人的には、すでに「......脳みそは全部バラバラ、ひねりは全部編み込み、カナダ当局が2回目の注射を打っている..."
間違いが見つからない...。私はまだまだですが...。:)
Gravitus писал(а) >>
...OrderMagicNumber()を使って、特定のローソク足ごとに計算する関数を内蔵する予定なので、各ローソク足とタイムフレームがユニークであることが望ましい。 ...どうすればうまく実装できますか?
例えば、EA名、シンボル、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もないプロジェクトで組んでるのに。
そして心理的には、あなたが熱く主張するようなたわごとを含まないからこそ、「より困難なもの」にも完全に対応できるのです。
Для примера - функция автоформирования магика по имени советника, символу и ТФ. По этому же принципу магик можно создать из чего угодно.
アートメディア70 私は、コード全体についてではなく、正しく動作していない部分についてだけ話しています。
他人のコードを調べるのが好きな人はいないでしょう。他人の暗号は、まず暗号であり、まだ解く必要があるからです。だから、このフォーラムのプログラマーは、「インジケータ(Expert Advisor)を直してくれ」といった要望には、なかなか応じようとしないのです。
Господа, знатоки! Подскажите, могу ли я в конструкции
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, я говорил лишь о том кусочке кода, который работает не правильно, а не обо всём коде вообще.
Копаться в чужих кодах не любит ни кто. Просто потому, что чужой код - это прежде всего криптограмма, которую ещё нужно разгадать. Именно поэтому программисты на этом форуме весьм неохотно откликаются на просьбы типа "Исправьте индикатор (советника)".
まず私に挑戦し、次に藪の中へ...。:)