Как высчитать TakeProfit "замка" - страница 3

 
Vitaly Muzichenko:
Мой изначально выложенный код работает в сове, и отрабатывает правильно, даже если по позициям набежал своп  и прочие издержки.
В тестере стратегий MarketInfo(symb,MODE_TICKVALUE) работает неправильно. Посмотрите сами!
 
lilita bogachkova:

Не претендую на 100% правильный код, но так ваш код правильнее (Для тестера стратегий 100%):

Получилось даже лучше.
 
lilita bogachkova:
В тестере стратегий MarketInfo(symb,MODE_TICKVALUE) работает неправильно. Посмотрите сами!

MarketInfo(symbol,MODE_TICKVALUE)  в тестере, если используется любая другая пара от пары к которой прикреплен эксперт выдает 0. Но какая разница что он выдаёт о другой паре, мультивалютного тестирования всё-равно нет!,  нам ведь нужна именно та пара, на которой тестируем, а она работает правильно. В онлайне всё работает правильно, независимо от пары.

Проверил на паре GBPJPY

0 19:46:07 2015.09.01 00:14  LINE_SINC GBPJPY,H1: symbol=GBPJPY, TickValue=8.256274768824307

0 19:46:07 2015.09.01 00:14  LINE_SINC GBPJPY,H1: symbol=USDCAD, TickValue=0

0 19:46:07 2015.09.01 00:14  LINE_SINC GBPJPY,H1: symbol=AUDUSD, TickValue=0

0 19:46:07 2015.09.01 00:14  LINE_SINC GBPJPY,H1: symbol=EURUSD, TickValue=0

0 19:46:07 2015.09.01 00:14  LINE_SINC GBPJPY,H1: symbol=GBPUSD, TickValue=0

0 19:46:07 2015.09.01 00:14  LINE_SINC GBPJPY,H1: symbol=USDCHF, TickValue=0

0 19:46:07 2015.09.01 00:14  LINE_SINC GBPJPY,H1: symbol=USDJPY, TickValue=0

0 19:46:07 2015.09.01 00:14  LINE_SINC GBPJPY,H1: symbol=EURGBP, TickValue=0

0 19:46:07 2015.09.01 00:14  LINE_SINC GBPJPY,H1: symbol=EURCHF, TickValue=0

0 19:46:07 2015.09.01 00:14  LINE_SINC GBPJPY,H1: symbol=EURJPY, TickValue=0

0 19:46:07 2015.09.01 00:14  LINE_SINC GBPJPY,H1: symbol=GBPCHF, TickValue=0 

 /////////////////////////////////////////////////////////////////////////////////////////////////

Так-же возникает вопрос о форматировании кода функции. Такая функция пишется один раз когда-то однажды очень давно, потом к ней только обращаются и не более, в ней ничего не правят, её не читают, её даже не видно где-то внизу самого кода, зачем делать с неё такой шлейф? Если речь идет о коде внутри старта, тогда вполне обосновано делать нормальное форматирование.

Вы с 11 строк кода, растянули шлейф на 19, а если таких функций не одна, тогда простой код будет состоять с 1000 строк кода - зачем? К тому-же это увеличивает вес файла.

 
Vitaly Muzichenko:

MarketInfo(symbol,MODE_TICKVALUE)  в тестере, если используется любая другая пара от пары к которой прикреплен эксперт выдает 0. Но какая разница что он выдаёт о другой паре, мультивалютного тестирования всё-равно нет!,  нам ведь нужна именно та пара, на которой тестируем, а она работает правильно. В онлайне всё работает правильно, независимо от пары.

Проверил на паре GBPJPY

0 19:46:07 2015.09.01 00:14  LINE_SINC GBPJPY,H1: symbol=GBPJPY, TickValue=8.256274768824307

0 19:46:07 2015.09.01 00:14  LINE_SINC GBPJPY,H1: symbol=USDCAD, TickValue=0

 /////////////////////////////////////////////////////////////////////////////////////////////////

Так-же возникает вопрос о форматировании кода функции. Такая функция пишется один раз когда-то однажды очень давно, потом к ней только обращаются и не более, в ней ничего не правят, её не читают, её даже не видно где-то внизу самого кода, зачем делать с неё такой шлейф? Если речь идет о коде внутри старта, тогда вполне обосновано делать нормальное форматирование.

Вы с 11 строк кода, растянули шлейф на 19, а если таких функций не одна, тогда простой код будет состоять с 1000 строк кода - зачем? К тому-же это увеличивает вес файла.

Спорить не стану, смотрите сами:

0 20:47:22 2015.01.29 13:29  TickValueError  EURUSD,M1: EURUSD TickValue=MarketInfo(symb,MODE_TICKVALUE)= 0.9236168837166344

0 20:47:22 2015.01.29 13:29  TickValueError  EURUSD,M1: EURUSD TickValue=((lotsize*(bid+point_))-(lotsize*bid))/exchrate= 0.8838841404668676

0 20:47:22 2015.01.29 13:29  TickValueError  EURUSD,M1: EURUSD TickValue=MarketInfo(symb,MODE_TICKVALUE)= 0.9236168837166344

0 20:47:22 2015.01.29 13:29  TickValueError  EURUSD,M1: EURUSD TickValue=((lotsize*(bid+point_))-(lotsize*bid))/exchrate= 0.8840013436949063

0 20:47:22 2015.01.29 13:30  TickValueError  EURUSD,M1: EURUSD TickValue=MarketInfo(symb,MODE_TICKVALUE)= 0.9236168837166344

0 20:47:22 2015.01.29 13:30  TickValueError  EURUSD,M1: EURUSD TickValue=((lotsize*(bid+point_))-(lotsize*bid))/exchrate= 0.8844704675310892

0 20:47:26 2015.02.03 13:41  TickValueError  EURUSD,M1: EURUSD TickValue=MarketInfo(symb,MODE_TICKVALUE)= 0.9236168837166344

0 20:47:26 2015.02.03 13:41  TickValueError  EURUSD,M1: EURUSD TickValue=((lotsize*(bid+point_))-(lotsize*bid))/exchrate= 0.8764318705685414 

0 20:47:28 2015.02.04 14:17  TickValueError  EURUSD,M1: EURUSD TickValue=MarketInfo(symb,MODE_TICKVALUE)= 0.9236168837166344

0 20:47:28 2015.02.04 14:17  TickValueError  EURUSD,M1: EURUSD TickValue=((lotsize*(bid+point_))-(lotsize*bid))/exchrate= 0.8751662815935027 

0 20:48:58 2016.01.29 21:59  TickValueError  EURUSD,M1: EURUSD TickValue=MarketInfo(symb,MODE_TICKVALUE)= 0.9236168837166344

0 20:48:58 2016.01.29 21:59  TickValueError  EURUSD,M1: EURUSD TickValue=((lotsize*(bid+point_))-(lotsize*bid))/exchrate= 0.9236083531273858 

0 20:48:58 2016.01.30 01:35  TickValueError  EURUSD,M1: EURUSD TickValue=MarketInfo(symb,MODE_TICKVALUE)= 0.9236168837166344

0 20:48:58 2016.01.30 01:35  TickValueError  EURUSD,M1: EURUSD TickValue=((lotsize*(bid+point_))-(lotsize*bid))/exchrate= 0.9236168837166343

 
Dmitry Fedoseev:

Офигеть! Такие портянки выложили и ни у кого нет правильно когда. За то вы все из себя тут такие. 

Бурные аплодисменты. 

ps. Самый прикол в том, что никто в это даже не поверит. Да? 

ps2. А я опять такой злодей, критикую. Да? 

Поддерживаю

Dmitry Fedoseev:

Обойдешься. Вы же ту все такие офигено крутые, вот и пишите себе сами правильный код

Как уже писал:

ps. Самый прикол в том, что никто в это даже не поверит. Да? 

ps2. А я опять такой злодей, критикую. Да? 

ps3 (специально для Alexander Bereznyak). Фильтруй базар. Ты уж не раздражаешь, ты уже просто смешишь.

Тоже поддерживаю
 

Так будет правильнее:

//===============================================================================================
//--------------------- Возвращает уровень безубытка открытых позиций --------------------------+
//===============================================================================================
double BreakEvenOpenPos(string symb="",int type=-1,int mg=-1)
  {
   int digit=0;
   double LotB=0.0,LotS=0.0,ProB=0.0,ProS=0.0,ResBr=0.0,TickValue=0.0,point_=0.0,ask=0.0,bid=0.0,lotsize=0.0,exchrate=0.0;
   if(symb=="")
      symb=_Symbol;
   ask=MarketInfo(symb, MODE_ASK);
   bid=MarketInfo(symb, MODE_BID);
   digit=(int)MarketInfo(symb,MODE_DIGITS);
   lotsize=MarketInfo(symb,MODE_LOTSIZE);
   point_=MarketInfo(symb,MODE_POINT);
   exchrate=AccountExchangeRate(symb);
   ProfitAndLotsOpenPosInCurrency(ProB,LotB,ProS,LotS,symb,mg);
   TickValue=((lotsize*(bid+point_))-(lotsize*bid))/exchrate;
// Расчеты
   if(LotB>0 && type==OP_BUY)
     {
      ResBr=ask-ProB/(TickValue*LotB)*point_;
      return NormalizeDouble(ResBr,digit);
     }
   if(LotS>0 && type==OP_SELL)
     {
      ResBr=bid+ProS/(TickValue*LotS)*point_;
      return NormalizeDouble(ResBr,digit);
     }
   if(LotB-LotS!=0 && type==-1)
     {
      double AskBidPrice=0.0;
      if(LotB>0)AskBidPrice=ask;else if(LotS>0)AskBidPrice=bid;else if(LotB>0 && LotS>0)AskBidPrice=(ask+bid)/2.0;
      ResBr=AskBidPrice-(ProB+ProS)/(TickValue*(LotB-LotS))*point_;
      return NormalizeDouble(ResBr,digit);
     }
   return 0;
  }
//+------------------------------------------------------------------+
//| Profit And Lots For Open Position In Currency                    |
//+------------------------------------------------------------------+
void ProfitAndLotsOpenPosInCurrency(double &profit_B,double &lot_B,double &profit_S,double &lot_S,string symbol_="",int magicNr=-1)
  {
   if(symbol_=="")
      symbol_=_Symbol;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         continue;
      if(OrderType()>OP_SELL)
         continue;
      if((OrderSymbol()==symbol_ || symbol_=="") && (magicNr<0 || OrderMagicNumber()==magicNr))
        {
         if(OrderType()==OP_BUY)
           {
            profit_B+=OrderProfit()+OrderSwap()+OrderCommission();
            lot_B+=OrderLots();
           }
         if(OrderType()==OP_SELL)
           {
            profit_S+=OrderProfit()+OrderSwap()+OrderCommission();
            lot_S+=OrderLots();
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| AccountExchangeRate = AccountCurrency / QuotedCurrency           |
//+------------------------------------------------------------------+
double AccountExchangeRate(string symbol)
  {
   string accCurrency=AccountCurrency();
   string baseCurrency=StringSubstr(symbol,0,3);
   string quotedCurrency=StringSubstr(symbol,3,3);

   if(accCurrency==quotedCurrency)
      return 1;
   else if(accCurrency==baseCurrency)
      return MarketInfo(symbol,MODE_BID);
   else
     {
      string prefix="",suffix="";
      getPrefixSuffix(prefix,suffix);
      string pair=prefix+StringConcatenate(accCurrency,quotedCurrency)+suffix;
      double rate=MarketInfo(pair,MODE_BID);

      int LastError=_LastError;
      if(LastError==4106)
        {
         pair=prefix+StringConcatenate(quotedCurrency,accCurrency)+suffix;
         rate=MarketInfo(pair,MODE_BID);
         LastError=_LastError;
         if(LastError==0)
           {
            rate=1/rate;
            return rate;
           }
         else
            return 1;
        }
      else if(LastError!=0)
        {
         return 1;
        }
     }
   return 1;
  }
//+------------------------------------------------------------------+
#define sectorSize  1936
#define HFILE_ERROR -1
//+------------------------------------------------------------------+
//| Get Prefix and Suffix                                             |
//+------------------------------------------------------------------+
void getPrefixSuffix(string &prefix_,string &suffix_)
  {
   int fileHandle=FileOpenHistory("symbols.raw",FILE_BIN|FILE_READ|FILE_SHARE_READ);
   if(fileHandle==HFILE_ERROR)
      return;
   prefix_=""; suffix_="";
   for(int i=0;; i++)
     {
      FileSeek(fileHandle,sectorSize*i,SEEK_SET);
      if(FileIsEnding(fileHandle))
        {
         prefix_="err";
         break;
        }
      string symbolName=FileReadString(fileHandle,12);
      symbolName=StringSubstr(symbolName,0);
      int pos=StringFind(symbolName,"EURUSD");
      if(pos>-1)
        {
         if(pos>0)
            prefix_=StringSubstr(symbolName,0,pos);
         if((pos+7)<=StringLen(symbolName))
            suffix_=StringSubstr(symbolName,(pos+6),0);
        }
     }
   if(fileHandle>-1)
      FileClose(fileHandle);
  }
//+------------------------------------------------------------------+

 

но лучше конечно  Prefix and Suffix  определять в OnInit() .

Причина обращения: