[AVISO FECHADO!] Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por aqui. Não posso ir a lugar algum sem você. - página 547
artmedia70, мы опять возвращаемся в точку отсчёта. Првое и самое главное - это алгоритм. То есть то, как должна работать программа. Если нет чёткого представления, то нет и программы, ибо нельзя сделать код, который не знаю как должен работать.
Давайте по-строчкам разберём кусочек Вашего кода, который работает не правильно. Только давайте разберём всё от и до. То есть, Вы будете предельно точным в обосновании почему Вы задействуете в этом месте именно этот способ, инструмент, подход. А? (Это не работа на публику - это попытка разобраться в самом себе - программинг - это сначала медитация, потом - кучка деталек, связанных болтиками, гаечками, шпонками, шпильками и прочей мелочёвкой). Делаем?
A seguir. Rastreamento de eventos que ocorreram desde a chegada do novo tick:
//--------------------------------------------------------------- 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, мы опять возвращаемся в точку отсчёта. Првое и самое главное - это алгоритм. То есть то, как должна работать программа. Если нет чёткого представления, то нет и программы, ибо нельзя сделать код, который не знаю как должен работать.
Давайте по-строчкам разберём кусочек Вашего кода, который работает не правильно. Только давайте разберём всё от и до. То есть, Вы будете предельно точным в обосновании почему Вы задействуете в этом месте именно этот способ, инструмент, подход. А? (Это не работа на публику - это попытка разобраться в самом себе - программинг - это сначала медитация, потом - кучка деталек, связанных болтиками, гаечками, шпонками, шпильками и прочей мелочёвкой). Делаем?
Função de informação exibindo mensagens no Informe vazio:
//--------------------------------------------------------------- 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 --
... e, na verdade, o próprio indicador:
//--------------------------------------------------------------------#property indicator_separate_window // Отдельное окно индикатора
IndicatorShortName("Inform");
//--------------------------------------------------------------------int start() // Специальная функция start()
{
}
//--------------------------------------------------------------------//+------------------------------------------------------------------+//| Custom indicator deinitialization function |//+------------------------------------------------------------------+int deinit()
{
ObjectsDeleteAll();
// удаляем все объектыreturn(0);
}
Pessoalmente, eu já "... ...todos os meus cérebros estão em pedaços, todas as minhas voltas estão trançadas e as autoridades canadenses estão me injetando com um segundo tiro"... Não consigo encontrar o erro... Eu ainda não cheguei lá... :)
...planejo usar OrderMagicNumber(), para fazer uma função embutida para calculá-la para cada vela específica, por isso é desejável que cada vela e cada período de tempo sejam únicos. ...Como implementá-la melhor?
Por exemplo, temos a função de auto-formar um magik pelo nome, símbolo e TF da EA. Você pode criar um mágico a partir de qualquer coisa pelo mesmo princípio.
//+----------------------------------------------------------------------------+//| Автор : 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());
Ну сами подумайте - психологически сложно обрабатывать информацию если она размазана на несколько листов - нужно постоянно прыгать туда-сюда листая код шоб анализировать всю картину. А ведь человек - не заяц и не лягушка шоб этим заниматься. Разумеется это не относится к случаям когда код состоит из трёх строчек, а шото посложней.
Porra, estou trabalhando em um projeto que não tem 2GB de memória para montar.
E psicologicamente, sou perfeitamente capaz de lidar com "coisas mais difíceis" precisamente porque não contém as tretas que você está defendendo com tanta paixão.
artmedia70 Eu estava falando apenas sobre uma parte do código que não está funcionando corretamente, não sobre o código em geral.
Ninguém gosta de escavar no código de outras pessoas. Simplesmente porque o código de outra pessoa é, antes de tudo, um criptograma, que ainda precisa ser resolvido. É por isso que os programadores neste fórum estão muito relutantes em responder a solicitações como "Consertar o indicador (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 бар
?????????????????
PERÍODO_XX tipo é um inteiro (int), qual é o problema?
Период графика может быть любым из следующих величин:
Константа Значение Описание
PERIOD_M111 минута
PERIOD_M555 минут
PERIOD_M151515 минут
PERIOD_M303030 минут
PERIOD_H1601 час
PERIOD_H42404 часа
PERIOD_D114401 день
PERIOD_W1100801 неделя
PERIOD_MN1432001 месяц
0 (ноль) 0 Период текущего графика
artmedia70, я говорил лишь о том кусочке кода, который работает не правильно, а не обо всём коде вообще.
Копаться в чужих кодах не любит ни кто. Просто потому, что чужой код - это прежде всего криптограмма, которую ещё нужно разгадать. Именно поэтому программисты на этом форуме весьм неохотно откликаются на просьбы типа "Исправьте индикатор (советника)".
Quem pode dizer que esse pedaço de código não funciona corretamente? Se eu afixasse todo o código, não haveria espaço suficiente... Primeiro você me desafia, depois vai para os arbustos... :)
artmedia70, мы опять возвращаемся в точку отсчёта. Првое и самое главное - это алгоритм. То есть то, как должна работать программа. Если нет чёткого представления, то нет и программы, ибо нельзя сделать код, который не знаю как должен работать.
Давайте по-строчкам разберём кусочек Вашего кода, который работает не правильно. Только давайте разберём всё от и до. То есть, Вы будете предельно точным в обосновании почему Вы задействуете в этом месте именно этот способ, инструмент, подход. А? (Это не работа на публику - это попытка разобраться в самом себе - программинг - это сначала медитация, потом - кучка деталек, связанных болтиками, гаечками, шпонками, шпильками и прочей мелочёвкой). Делаем?
A seguir. Rastreamento de eventos que ocorreram desde a chegada do novo tick:
artmedia70, мы опять возвращаемся в точку отсчёта. Првое и самое главное - это алгоритм. То есть то, как должна работать программа. Если нет чёткого представления, то нет и программы, ибо нельзя сделать код, который не знаю как должен работать.
Давайте по-строчкам разберём кусочек Вашего кода, который работает не правильно. Только давайте разберём всё от и до. То есть, Вы будете предельно точным в обосновании почему Вы задействуете в этом месте именно этот способ, инструмент, подход. А? (Это не работа на публику - это попытка разобраться в самом себе - программинг - это сначала медитация, потом - кучка деталек, связанных болтиками, гаечками, шпонками, шпильками и прочей мелочёвкой). Делаем?
Função de informação exibindo mensagens no Informe vazio:
... e, na verdade, o próprio indicador:
Pessoalmente, eu já "... ...todos os meus cérebros estão em pedaços, todas as minhas voltas estão trançadas e as autoridades canadenses estão me injetando com um segundo tiro"...
Não consigo encontrar o erro... Eu ainda não cheguei lá... :)
Gravitus писал(а) >>
...planejo usar OrderMagicNumber(), para fazer uma função embutida para calculá-la para cada vela específica, por isso é desejável que cada vela e cada período de tempo sejam únicos. ...Como implementá-la melhor?
Por exemplo, temos a função de auto-formar um magik pelo nome, símbolo e TF da EA. Você pode criar um mágico a partir de qualquer coisa pelo mesmo princípio.
MACDmn_0 =iMACD(NULL,PERÍODO_M5,IND_Value1,IND_Value2,IND_Value3,PRICE_CLOSE,MODE_MAIN,0); // 0 bar
Usar valores explícitos em vez de PERÍODO_M5? Neste exemplo, é 5:
MACDmn_0 =iMACD(NULL,5,IND_Value1,IND_Value2,IND_Value3,PRICE_CLOSE,MODE_MAIN,0); // 0 bar
?????????????????
Ну сами подумайте - психологически сложно обрабатывать информацию если она размазана на несколько листов - нужно постоянно прыгать туда-сюда листая код шоб анализировать всю картину. А ведь человек - не заяц и не лягушка шоб этим заниматься. Разумеется это не относится к случаям когда код состоит из трёх строчек, а шото посложней.
Porra, estou trabalhando em um projeto que não tem 2GB de memória para montar.
E psicologicamente, sou perfeitamente capaz de lidar com "coisas mais difíceis" precisamente porque não contém as tretas que você está defendendo com tanta paixão.
Для примера - функция автоформирования магика по имени советника, символу и ТФ. По этому же принципу магик можно создать из чего угодно.
artmedia70 Eu estava falando apenas sobre uma parte do código que não está funcionando corretamente, não sobre o código em geral.
Ninguém gosta de escavar no código de outras pessoas. Simplesmente porque o código de outra pessoa é, antes de tudo, um criptograma, que ainda precisa ser resolvido. É por isso que os programadores neste fórum estão muito relutantes em responder a solicitações como "Consertar o indicador (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 бар
?????????????????
PERÍODO_XX tipo é um inteiro (int), qual é o problema?
artmedia70, я говорил лишь о том кусочке кода, который работает не правильно, а не обо всём коде вообще.
Копаться в чужих кодах не любит ни кто. Просто потому, что чужой код - это прежде всего криптограмма, которую ещё нужно разгадать. Именно поэтому программисты на этом форуме весьм неохотно откликаются на просьбы типа "Исправьте индикатор (советника)".
Primeiro você me desafia, depois vai para os arbustos... :)