В ячейках файла в таком случае находятся не результат, а формулы. При открытии файла будут извлечены именно они. Результат считает и отображает сам excel, в файле результатов нет.Нет, не подходит, нужно закладывать формулы расчета в Excel , выводится только результат на график.
Ну тогда напиши программку на VB. Язык встроенный в Excel, достаточно богат для таких задач. Пусть он вычисляет и записывает данные в csv а оттуда возьмёт МТ своими средствами.Нет, не подходит, нужно закладывать формулы расчета в Excel , выводится только результат на график.
Практически всё что считается в excel, можно посчитать в mql.Ну тогда напиши программку на VB. Язык встроенный в Excel, достаточно богат для таких задач. Пусть он вычисляет и записывает данные в csv а оттуда возьмёт МТ своими средствами.
Ну или, я-бы попробовал такую связку:
В книге Excel все вычисления а в файле csv (он со значком Excel и по умолчанию в нём открывается) поставить ссылку на результат вычисления, =книга,страница,ячейка. Может прокатит...
ps: ну вот, Андрей развеял мои надежды. Да, этого я не учёл. Тогда остаётся писать на VB.
Надеюсь это беззлобная подъё***Практически всё что считается в excel, можно посчитать в mql.
Но если мы не ищем лёгких путей, то можно написать прогу на VB.
А ещё можно программно запустить и открыть файл в экселе, снять скриншот с экрана, из графического файла распознать текст, преобразовать в дробные значения... :laugh:
Да, никакой злобы. Это конечно шутка. А если кроме шуток, то можно вообще не использовать промежуточный CSV файл. Можно используя VB и виндовые библиотеки, через оперативку транслировать прямо в программу на MQL.Надеюсь это беззлобная подъё***
Не думаешь-же ты что реально так придёт кому-то в голову сделать...
В Excel есть волшебная клавиша F9 встаёшь на формулу нажимаешь на неё и вместо формулы результат вычисления. А программно перевести все результаты формул в числа совсем плёвое дело.
Ну не зря ведь человек хочет из Excel перетащить на график, значит есть тому причина. И нисколько этот вариант не сложней чем считать в MQL.
Ага... А потом С++, делфи, фортран... Ну и ещё чего нибудь.Да, никакой злобы. Это конечно шутка. А если кроме шуток, то можно вообще не использовать промежуточный CSV файл. Можно используя VB и виндовые библиотеки, через оперативку транслировать прямо в программу на MQL.
Только всё это наверное не для уроков по MQL. Вернее к урокам по MQL придётся прибавить уроки по VB.
Молодца.А у меня и без вас все получилось, сделала скрипт. В помощи не нуждаюсь.
при всем уважении к вам как к программисту, хочу поспорить на счет олимпийских чемпионов и тренеров - в 99% случаев бывшие чемпионы становятся тренерами, ибо кто научит спорстсмена лучше , чем сам спортсмен прошедший эту школу с низу до верху, он досконально знает все препятствия на пути, ибо нет лучшего учителя чем жизнь...аналогично если начальник прошел путь от рабочего, он гораздо лучше во всем разбирается, чем выпускник ВУЗа.....Я никого лошарами не обзывал и не собираюсь учить кого то кодить. Уметь самому и уметь учить, это разные навыки. То что я умею писать программы ещё не означает что смогу кого то этому научить. И наоборот. Олимпийский чемпион завоёвывает золотые медали, а его тренер вряд ли сможет то же самое. Зато он смог обучить, натренеровать чемпиона. По этому, учит тот кто сам не может, это не обзывательство, а нормальная реальность.
Просто я подумал что если начинать с расширений файлов то до программирования вы долго не доберётесь. А между тем, начинающему программисту не терпится написать первую программу, пусть бестолковую, но работающую.
Ладно, прошу прощения что влез. Я уже говорил что учить не умею. Значит влез не в своё дело.
if(isCloseLastPosByTake(NULL,-1,Magic)==true){
if(ExistPositions(NULL,-1,Magic)==false){
if(NumberOfOrders(NULL,-1,Magic)==1){
DeleteOrders(NULL,-1,Magic);
return(0);
}}}
Дом если бы это был не ты, то я бы почти нагрубил бы. Потому что есть соответсвующая ветка.Здравствуйте!Уважаемые программисты!Помогите пожалуйста!Я часто использую пользовательские функции Кирилла.У меня выставлено два противоположных ордера,один из них закрылся по TakeProfit,мне надо удалить второй.Я делаю так:
он не удаляется.Первая функция это:"Возвращает флаг закрытия последней позиции по тейку."Что я не так делаю?Код:if(isCloseLastPosByTake(NULL,-1,Magic)==true){ if(ExistPositions(NULL,-1,Magic)==false){ if(NumberOfOrders(NULL,-1,Magic)==1){ DeleteOrders(NULL,-1,Magic); return(0); }}}
И второй вопрос.Советник работает нормально,неделю,две,затем бах на спокойном рынке открывает позицию,противоположную той,которая запрограммирована.Я не знаю,как с этим бороться.
OrderClosePrice()==OrderTakeProfit()
NormalizeDouble(OrderClosePrice(),Digits)==NormalizeDouble(OrderTakeProfit(),Digits)
Здравствуйте!Уважаемые программисты!Помогите пожалуйста!Я часто использую пользовательские функции Кирилла.У меня выставлено два противоположных ордера,один из них закрылся по TakeProfit,мне надо удалить второй.Я делаю так:
он не удаляется.Первая функция это:"Возвращает флаг закрытия последней позиции по тейку."Что я не так делаю?Код:if(isCloseLastPosByTake(NULL,-1,Magic)==true){ if(ExistPositions(NULL,-1,Magic)==false){ if(NumberOfOrders(NULL,-1,Magic)==1){ DeleteOrders(NULL,-1,Magic); return(0); }}}
И второй вопрос.Советник работает нормально,неделю,две,затем бах на спокойном рынке открывает позицию,противоположную той,которая запрограммирована.Я не знаю,как с этим бороться.
Извините,что не в этой ветке,голова уже не соображает.Спасибо,что ответили,буду разбираться.Функция:Дом если бы это был не ты, то я бы почти нагрубил бы. Потому что есть соответсвующая ветка.
Противоположные это 2 отложки?
Рыночные?
Я бы решал это так.
Искал бы последний закрытый ордер. И если он закрытый по ТП, то
брал с него данные(бай или сел, если надо то лоты).
И потом бы сравнивал с последним открытым ордером.
Твоя проблема навреное в том. Глянь где естьнормализируй ихPHP:OrderClosePrice()==OrderTakeProfit()
PHP:NormalizeDouble(OrderClosePrice(),Digits)==NormalizeDouble(OrderTakeProfit(),Digits)
Ах да. Я кажется понял. Если ты на ЕСН это делаешь, то там редко когда цена закрытия равна ТП или СЛ. Так что последний закрытый ордер прийдётся искать по коментарию к ордеру. Иксать буквы tp
Короче покажи функцию isCloseLastPosByTake
//+----------------------------------------------------------------------------+
//| Версия : 19.05.2008 |
//| Описание : Возвращает флаг закрытия последней позиции по тейку. |
//+----------------------------------------------------------------------------+
//| Параметры: |
//| sy - наименование инструмента ("" - любой символ, |
//| NULL - текущий символ) |
//| op - операция (-1 - любая позиция) |
//| mn - MagicNumber (-1 - любой магик) |
//+----------------------------------------------------------------------------+
bool isCloseLastPosByTake(string sy="", int op=-1, int mn=-1) {
datetime t;
double ocp, otp;
int dg, i, j=-1, k=OrdersHistoryTotal();
if (sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
if (OrderSymbol()==sy || sy=="") {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
if (mn<0 || OrderMagicNumber()==mn) {
if (t<OrderCloseTime()) {
t=OrderCloseTime();
j=i;
}
}
}
}
}
}
}
if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
dg=MarketInfo(sy, MODE_DIGITS);
if (dg==0) if (StringFind(OrderSymbol(), "JPY")<0) dg=4; else dg=2;
ocp=NormalizeDouble(OrderClosePrice(), dg);
otp=NormalizeDouble(OrderTakeProfit(), dg);
if (ocp==otp) return(True);
}
return(False);
}
Ну значит так как я говорил. Потом сделаю проверку по коментарию.Извините,что не в этой ветке,голова уже не соображает.Спасибо,что ответили,буду разбираться.Функция:
...
Ну значит так как я говорил. Потом сделаю проверку по коментарию.
bool isCloseLastPosByTake(string sy="", int op=-1, int mn=-1)
{
int time_close;
int latest_closed_order;
for(int h=OrdersHistoryTotal()-1;h>=0;h--)
{
if(OrderSelect(h,SELECT_BY_POS,MODE_HISTORY))
{
if((OrderSymbol()==sy || sy=="") && (OrderType()==op || op==-1) && (OrderMagicNumber()==mn || mn==-1))
{
if(OrderCloseTime()>time_close)
{
if(OrderType()==OP_BUY || OrderType()==OP_SELL)
{
time_close=OrderCloseTime();
latest_closed_order=h;
}
}
}
}
}
if(OrderSelect(latest_closed_order,SELECT_BY_POS,MODE_HISTORY))
{
if(StringFind(OrderComment(),"[tp]",0)!=-1)
return(true);
}
return(False);
}
eevviill!Нет слов.Огромное спасибо!Мне бы долго пришлось с этим разбираться.Премного благодарен!!!PHP:bool isCloseLastPosByTake(string sy="", int op=-1, int mn=-1) { int time_close; int latest_closed_order; for(int h=OrdersHistoryTotal()-1;h>=0;h--) { if(OrderSelect(h,SELECT_BY_POS,MODE_HISTORY)) { if((OrderSymbol()==sy || sy=="") && (OrderType()==op || op==-1) && (OrderMagicNumber()==mn || mn==-1)) { if(OrderCloseTime()>time_close) { if(OrderType()==OP_BUY || OrderType()==OP_SELL) { time_close=OrderCloseTime(); latest_closed_order=h; } } } } } if(OrderSelect(latest_closed_order,SELECT_BY_POS,MODE_HISTORY)) { if(StringFind(OrderComment(),"[tp]",0)!=-1) return(true); } return(False); }
Пожалуйста. Но мне Гамбер(надеюсь правильно на руский транслировал) замечание сделал как лучше. Не порядковый номер записывать, а тикет.eevviill!Нет слов.Огромное спасибо!Мне бы долго пришлось с этим разбираться.Премного благодарен!!!
latest_closed_order=OrderTicket();
}
}
}
}
}
if(OrderSelect(latest_closed_order,SELECT_BY_TICKET,MODE_HISTORY))
не вытерпел, извините, при всем уважении есть одна неточность, думаю для тех кто начинает изучать язык нельзя запоминать неверные значения...незнаю ваши слова или цитата от куда то, в любом случае это неверно, потому что еще из математики известно:1.3) {} (квадратные скобки) - применяются для начала фунции и конца.
1.4) () (скобки) - в них(не всегда) записываются свойства операции.
Понял!Спасибо!Пожалуйста. Но мне Гамбер(надеюсь правильно на руский транслировал) замечание сделал как лучше. Не порядковый номер записывать, а тикет.
PHP:latest_closed_order=OrderTicket(); } } } } } if(OrderSelect(latest_closed_order,SELECT_BY_TICKET,MODE_HISTORY))