Извиняюсь перед админами, что повторясь, но мне еще никто ни полслова не сказал в ответ. Идея состоит в том, чтобы выводить в коментах сообщения, сохраняемые в логах, т.е. те, которые не могут быть зафиксированы корректно функцией IsConnected() - обрывы связи, реквесты. Иначе не ясна причина, почему советник в данный момент ничего не делает.
Подскажите, пожалуйста, ниже код для чтения лог-файла. Автоматически читается текущий по дате лог-файл и выводится в принт.
Там, где:
while (result>0) {
происходит сборка файла из частей. Но мне нужен не весь файл, а только последняя строка. Помогите откорректировать, пожалуйста.
void ReadWrite() {
string tekTime=TimeStr1(CurTime(),1);
string path=TerminalPath()+"\\logs\\"+tekTime+".log";
string title="Чтение из файла";
string msg;
int result;
int handle=_lopen(path,4);
if (handle<0) {
msg="Ошибка открытия файла";
Print(msg);
return;
}
result=_llseek (handle,0,0);
string buffer="";
//string char="x ";stringchar="x ";
int count=0;
result=_lread (handle,char,250);
while (result>0) {
buffer=buffer+char;
char="x ";
count++;
result=_lread (handle,char,250);
}
result=_lclose (handle);
msg=StringTrimRight(buffer);
Print(msg);
}
//------------------расчет времени----------------string TimeStr1(int taim,int tip)
{
string sTaim;
string sTaim1,sTaim2,sTaim3;
if (tip==1)
{
int GD=TimeYear(taim);
int MN=TimeMonth(taim);
int DD=TimeDay(taim);
sTaim1 = DoubleToStr(GD,0);
if (MN<10) sTaim2 = StringConcatenate(sTaim2,"0"+DoubleToStr(MN,0));
else sTaim2 = StringConcatenate(sTaim2,DoubleToStr(MN,0));
if (DD<10) sTaim3 = StringConcatenate("0",DoubleToStr(DD,0));
else sTaim3 = DoubleToStr(DD,0);
sTaim=sTaim1+sTaim2+sTaim3;
}
return(sTaim);
}
Вот функция, которая ответит, была ли последняя сделка прибыльной или убыточной:
Далее, сравнивая ее ответ с нулем, принимаете решение оставить TP/SL прежними или их изменить.
А ваша функция точно вернёт последний ордер? Или первый встреченный не убыточный? А зачем там проверка тикета?
Я бы сделал так:
//+----------------------------------------------------------------------------+double LastOrderProfit() {
double Profit=0;
datetime t;
int i, j;
for (i=0; i<OrdersHistoryTotal(); i++) {
if (!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue;
if (OrderMagicNumber()!=Magic) continue;
if (OrderSymbol()!=Symbol()) continue;
if (OrderType()>1) continue;
if (t<OrderCloseTime()) {
t=OrderCloseTime();
j=i;
}
}
if (OrderSelect(j,SELECT_BY_POS,MODE_HISTORY)
Profit=OrderProfit()+OrderSwap()+OrderCommission();
return(Profit);
}
//+----------------------------------------------------------------------------+
Это переделанная ваша функция для поиска именно последнего закрытого ордера.
Она имеет недостаток - если ордеров вообще не было закрытых, она вернёт ноль. Таким образом, используя её, невозможно точно узнать наличие или отсутствие в истории закрытых ордеров. Ведь возвращаемый ноль не говорит о том, что ордера вообще нет, а говорит о том, что он закрыт в ноль.
интересует отрисовка значения индикатора только для последнего (текущего) бара. Однако, при открытии нового бара, старые значения остаются на чарте.... Каким образом можно принудительно убирать этот мусор? Можно ли как-то задать условие, что для бара [0] значения индикатора рассчитываются и показываются, а для баров от [1] до [Bar-1] эти значения обнуляются?
double Buffer [1];
int init()
{
IndicatorBuffers(1);
SetIndexStyle(0,DRAW_ARROW);
.........
return(0);
}
int deinit()
{
return(0);
}
int start()
{
int limit;
int counted_bars=IndicatorCounted();
if(counted_bars<0) counted_bars=0;
if(counted_bars>0) counted_bars--;
limit=Bars-counted_bars;
for(int i=limit;i>=0;i--)
{
Buffer [0] = ............;
}
return(0);
}
Она имеет недостаток - если ордеров вообще не было закрытых, она вернёт ноль. Таким образом, используя её, невозможно точно узнать наличие или отсутствие в истории закрытых ордеров. Ведь возвращаемый ноль не говорит о том, что ордера вообще нет, а говорит о том, что он закрыт в ноль.
Спасибо! Хоть Вы отвечали и не мне, но ответили на мой прошлый вопрос, касательно правильного расчета профита:
интересует отрисовка значения индикатора только для последнего (текущего) бара. Однако, при открытии нового бара, старые значения остаются на чарте.... Каким образом можно принудительно убирать этот мусор? Можно ли как-то задать условие, что для бара [0] значения индикатора рассчитываются и показываются, а для баров от [1] до [Bar-1] эти значения обнуляются?
В начале Start() инициализируйте буфер значением EMPTY_VALUE. То есть делайте это с появлением нового бара, проверяйте время открытия нулевого и делайте Вашу логику по очистке мусора.
А ваша функция точно вернёт последний ордер? Или первый встреченный не убыточный? А зачем там проверка тикета?
Я бы сделал так:
Это переделанная ваша функция для поиска именно последнего закрытого ордера.
Она имеет недостаток - если ордеров вообще не было закрытых, она вернёт ноль. Таким образом, используя её, невозможно точно узнать наличие или отсутствие в истории закрытых ордеров. Ведь возвращаемый ноль не говорит о том, что ордера вообще нет, а говорит о том, что он закрыт в ноль.
1. Функция находит в истории ордер с наибольшим тикетом, что и означает последний закрытый ордер (если, конечно, не брать некий исключительный случай, для которго Ваш вариант с максимальным временем закрытия предпочтительнее).
2. Согласно условиям Заказчика, первый ордер открывается с заданными TP/SL и только второй может быть открыт с новыми TP/SL, а из этого следует, что вернуть ноль функция может, лишь если первая сделка была нулевой, но никак не из-за отсутствия в истории закрытых ордеров.
И последнее. В Вашем варианте использование j и еще одного SELECTв функции - излишество.
достаточно :
if (t<OrderCloseTime()) {
t=OrderCloseTime();
Profit=OrderProfit()+OrderSwap()+OrderCommission();
}
return(Profit);
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
.
во вставилось. проблемы с циклом и восстановлением начальных значений после выхода из цикла
Вот функция, которая ответит, была ли последняя сделка прибыльной или убыточной:
Далее, сравнивая ее ответ с нулем, принимаете решение оставить TP/SL прежними или их изменить.
Всем привет. Заинтересовал индикатор IN10TION NewsReader. Хочу прикрепить его к советнику.
Если появилась красная черта(Market.TdOpen) и Market.Price.DOWN(красная) то продажа
Если появилась красная черта(Market.TdOpen) и Market.Price.UP(зеленая) то покупка
Какие возможно действия предпринять? побывал через iCustom не выходит!
_yIN10TIONfNewsReaderov09.99kblite.ex4 (115.59 KB) удалить
Извиняюсь перед админами, что повторясь, но мне еще никто ни полслова не сказал в ответ. Идея состоит в том, чтобы выводить в коментах сообщения, сохраняемые в логах, т.е. те, которые не могут быть зафиксированы корректно функцией IsConnected() - обрывы связи, реквесты. Иначе не ясна причина, почему советник в данный момент ничего не делает.
Подскажите, пожалуйста, ниже код для чтения лог-файла. Автоматически читается текущий по дате лог-файл и выводится в принт.
Там, где:
происходит сборка файла из частей. Но мне нужен не весь файл, а только последняя строка. Помогите откорректировать, пожалуйста.
Нужна помощь изменить советник
Советник должен торговать на оборот.
Вместо sell limit ордеров buy
а buy limit ордеров sell
Вот функция, которая ответит, была ли последняя сделка прибыльной или убыточной:
Далее, сравнивая ее ответ с нулем, принимаете решение оставить TP/SL прежними или их изменить.
А ваша функция точно вернёт последний ордер? Или первый встреченный не убыточный? А зачем там проверка тикета?
Я бы сделал так:
Это переделанная ваша функция для поиска именно последнего закрытого ордера.
Она имеет недостаток - если ордеров вообще не было закрытых, она вернёт ноль. Таким образом, используя её, невозможно точно узнать наличие или отсутствие в истории закрытых ордеров. Ведь возвращаемый ноль не говорит о том, что ордера вообще нет, а говорит о том, что он закрыт в ноль.
Подскажите, пожалуйста:
интересует отрисовка значения индикатора только для последнего (текущего) бара. Однако, при открытии нового бара, старые значения остаются на чарте.... Каким образом можно принудительно убирать этот мусор? Можно ли как-то задать условие, что для бара [0] значения индикатора рассчитываются и показываются, а для баров от [1] до [Bar-1] эти значения обнуляются?
artmedia70:
Она имеет недостаток - если ордеров вообще не было закрытых, она вернёт ноль. Таким образом, используя её, невозможно точно узнать наличие или отсутствие в истории закрытых ордеров. Ведь возвращаемый ноль не говорит о том, что ордера вообще нет, а говорит о том, что он закрыт в ноль.
Спасибо! Хоть Вы отвечали и не мне, но ответили на мой прошлый вопрос, касательно правильного расчета профита:
Подскажите, пожалуйста:
интересует отрисовка значения индикатора только для последнего (текущего) бара. Однако, при открытии нового бара, старые значения остаются на чарте.... Каким образом можно принудительно убирать этот мусор? Можно ли как-то задать условие, что для бара [0] значения индикатора рассчитываются и показываются, а для баров от [1] до [Bar-1] эти значения обнуляются?
А ваша функция точно вернёт последний ордер? Или первый встреченный не убыточный? А зачем там проверка тикета?
Я бы сделал так:
Это переделанная ваша функция для поиска именно последнего закрытого ордера.
Она имеет недостаток - если ордеров вообще не было закрытых, она вернёт ноль. Таким образом, используя её, невозможно точно узнать наличие или отсутствие в истории закрытых ордеров. Ведь возвращаемый ноль не говорит о том, что ордера вообще нет, а говорит о том, что он закрыт в ноль.
1. Функция находит в истории ордер с наибольшим тикетом, что и означает последний закрытый ордер (если, конечно, не брать некий исключительный случай, для которго Ваш вариант с максимальным временем закрытия предпочтительнее).
2. Согласно условиям Заказчика, первый ордер открывается с заданными TP/SL и только второй может быть открыт с новыми TP/SL, а из этого следует, что вернуть ноль функция может, лишь если первая сделка была нулевой, но никак не из-за отсутствия в истории закрытых ордеров.
И последнее. В Вашем варианте использование j и еще одного SELECTв функции - излишество.
достаточно :
В начале Start() инициализируйте буфер значением EMPTY_VALUE.
Это как? У меня это стоит в настройках линии индикатора после int init()
SetIndexStyle(0,DRAW_ARROW); SetIndexArrow(0,165); SetIndexBuffer(0,Buffer); SetIndexEmptyValue(0,0.0);