[АРХИВ] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 3. - страница 317

 
enya:

.

во вставилось. проблемы с циклом и восстановлением начальных значений после выхода из цикла

Вот функция, которая ответит, была ли последняя сделка прибыльной или убыточной:

 double LastOrderProfit()
 {
   double Profit=0;
   int ticket; 
   for(int i=0; i<OrdersHistoryTotal(); i++){
     if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))continue;
      if(OrderSymbol()!=Symbol())continue;
     if(OrderMagicNumber()!=Magic)continue;
     if(OrderType()>1)continue;
     if(ticket<OrderTicket()){
        ticket=OrderTicket();
        Profit=OrderProfit()+OrderSwap()+OrderCommission();
     } 
   }     
 return(Profit);
 } 

Далее, сравнивая ее ответ с нулем, принимаете решение оставить TP/SL прежними или их изменить.

 if(LastOrderProfit()>0) newTPSL=false; else  newTPSL=true;
if(newTPSL)OrderModify(.......newSL,newTP...);
 

Всем привет. Заинтересовал индикатор IN10TION NewsReader. Хочу прикрепить его к советнику.

Если появилась красная черта(Market.TdOpen) и Market.Price.DOWN(красная) то продажа

Если появилась красная черта(Market.TdOpen) и Market.Price.UP(зеленая) то покупка

Какие возможно действия предпринять? побывал через iCustom не выходит!


extern bool Market.TdOpen = TRUE;
extern color Market.TdOpen.Color = Red;
extern bool Market.TdFibo = TRUE;
extern color Market.TdFibo.Color = C'0x00,0x32,0x00';
extern color Market.Price.UP = Lime;
extern color Market.Price.DOWN = Red;
extern bool Market.Price.Guide = TRUE;

Прикрепленные файлы:
_yIN10TIONfNewsReaderov09.99kblite.ex4 (115.59 KB) удалить

 

Извиняюсь перед админами, что повторясь, но мне еще никто ни полслова не сказал в ответ. Идея состоит в том, чтобы выводить в коментах сообщения, сохраняемые в логах, т.е. те, которые не могут быть зафиксированы корректно функцией 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                      ";
   string char="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);
}
 

Нужна помощь изменить советник

Советник должен торговать на оборот.

Вместо sell limit ордеров buy

а buy limit ордеров sell

Файлы:
tke.mq4  18 kb
 
mersi:

Вот функция, которая ответит, была ли последняя сделка прибыльной или убыточной:

Далее, сравнивая ее ответ с нулем, принимаете решение оставить 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);
  }        
 

artmedia70:

Она имеет недостаток - если ордеров вообще не было закрытых, она вернёт ноль. Таким образом, используя её, невозможно точно узнать наличие или отсутствие в истории закрытых ордеров. Ведь возвращаемый ноль не говорит о том, что ордера вообще нет, а говорит о том, что он закрыт в ноль.

Спасибо! Хоть Вы отвечали и не мне, но ответили на мой прошлый вопрос, касательно правильного расчета профита:

Profit=OrderProfit()+OrderSwap()+OrderCommission();
 
Azerus:

Подскажите, пожалуйста:

интересует отрисовка значения индикатора только для последнего (текущего) бара. Однако, при открытии нового бара, старые значения остаются на чарте.... Каким образом можно принудительно убирать этот мусор? Можно ли как-то задать условие, что для бара [0] значения индикатора рассчитываются и показываются, а для баров от [1] до [Bar-1] эти значения обнуляются?

В начале Start() инициализируйте буфер значением EMPTY_VALUE. То есть делайте это с появлением нового бара, проверяйте время открытия нулевого и делайте Вашу логику по очистке мусора.

 
artmedia70:

А ваша функция точно вернёт последний ордер? Или первый встреченный не убыточный? А зачем там проверка тикета?

Я бы сделал так:

Это переделанная ваша функция для поиска именно последнего закрытого ордера.

Она имеет недостаток - если ордеров вообще не было закрытых, она вернёт ноль. Таким образом, используя её, невозможно точно узнать наличие или отсутствие в истории закрытых ордеров. Ведь возвращаемый ноль не говорит о том, что ордера вообще нет, а говорит о том, что он закрыт в ноль.

1. Функция находит в истории ордер с наибольшим тикетом, что и означает последний закрытый ордер (если, конечно, не брать некий исключительный случай, для которго Ваш вариант с максимальным временем закрытия предпочтительнее).

2. Согласно условиям Заказчика, первый ордер открывается с заданными TP/SL и только второй может быть открыт с новыми TP/SL, а из этого следует, что вернуть ноль функция может, лишь если первая сделка была нулевой, но никак не из-за отсутствия в истории закрытых ордеров.

И последнее. В Вашем варианте использование j и еще одного SELECTв функции - излишество.

достаточно :

 if (t<OrderCloseTime()) {
         t=OrderCloseTime();
      Profit=OrderProfit()+OrderSwap()+OrderCommission();
  }
   return(Profit);
 
snail09:
В начале Start() инициализируйте буфер значением EMPTY_VALUE.


Это как? У меня это стоит в настройках линии индикатора после int init()

   SetIndexStyle(0,DRAW_ARROW);
   SetIndexArrow(0,165);                     
   SetIndexBuffer(0,Buffer);
   SetIndexEmptyValue(0,0.0);
Причина обращения: