Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 11

 
AndEv:
Добрый день. Есть две точки с координатами (x1,y1) и (x2,y2). Как по этим двум точкам построить логарифмическую функцию с основанием логарифма, отличным от натурального? Вроде бы просится использовать обратную функцию (), но нужно ее как-то развернуть по-диагонали,  не соображу, как. Если кто сталкивался, подскажите, пожалуйста. Заранее благодарен.

Легко, делить на основание твоего логарифма. То есть если тебе нужен логарифм икс по степени два, ты логарифм икс делишь на логарифм двух, и получаешь логарифм икс по степени два.
 
gyfto:

Легко, делить на основание твоего логарифма. То есть если тебе нужен логарифм икс по степени два, ты логарифм икс делишь на логарифм двух, и получаешь логарифм икс по степени два.
Не совсем понял. Я имел ввиду то, что штатная логарифмическая функция в МТ4 вычисляет только натуральный логарифм числа. Другой логарифмической функции в МТ4 нет. Можно использовать обратную функцию, т.е. MathPow, но для этого ее необходимо зеркально отобразить относительно диагонали. Не соображу, как это проще сделать.
 
Fox_RM:

Можно уточнить, что значит не по рыночной цене? C SELLLIMIT и BUYLIMIT, все верно.

В правку зайди и прочитай что такое отложенные ордера.. и все вопросы отпадут.
 
hoz:

В правку зайди и прочитай что такое отложенные ордера.. и все вопросы отпадут.


Sell limit - продажа от верхней границы, Buy limit - покупка от нижней. Все

верно с отложенниками, не в них дело. 

 
У вас в коде все ордера рыночные
 
AndEv:
Не совсем понял. Я имел ввиду то, что штатная логарифмическая функция в МТ4 вычисляет только натуральный логарифм числа. Другой логарифмической функции в МТ4 нет. Можно использовать обратную функцию, т.е. MathPow, но для этого ее необходимо зеркально отобразить относительно диагонали. Не соображу, как это проще сделать.


Про это?    

Обратная к степенной функции - логарифмическая по тому же основанию. Для того, чтобы получить логарифмическую функцию по нужному основанию a, нужно MathLog(x) поделить на MathLog(a).

 
gyfto:


Про это?    

Обратная к степенной функции - логарифмическая по тому же основанию. Для того, чтобы получить логарифмическую функцию по нужному основанию a, нужно MathLog(x) поделить на MathLog(a).

Да, теперь понял, спасибо
 
hoz:
Нада примерно так:


Что-то, я не так делаю...

Было так:

int start()                         
  {
   int i, Counted_bars;  
//--------------------------------------------------------------------
   CurrentPoint1 = 0;
   CurrentPoint2 = 0; 
   kVol1=MarketInfo(Symbol_1, MODE_TICKVALUE)/MarketInfo(Symbol_1, MODE_TICKSIZE);
   kVol2=MarketInfo(Symbol_2, MODE_TICKVALUE)/MarketInfo(Symbol_2, MODE_TICKSIZE);
   Counted_bars=IndicatorCounted(); 
   i=Bars-Counted_bars-1;           
   while(i>=0)                     
     {
      Symbol1_Buf[i] = MACD (Symbol_1, iBarShift(Symbol_1, 0, Time[i], FALSE));
      if(Revers) Symbol2_Buf[i] = -1*MACD (Symbol_2, iBarShift(Symbol_2, 0, Time[i], FALSE));
      else Symbol2_Buf[i] = MACD (Symbol_2, iBarShift(Symbol_2, 0, Time[i], FALSE));
      
      if((Symbol1_Buf[i+1]>Symbol2_Buf[i+1] && Symbol1_Buf[i+2]<=Symbol2_Buf[i+2]) ||
         (Symbol1_Buf[i+1]<Symbol2_Buf[i+1] && Symbol1_Buf[i+2]>=Symbol2_Buf[i+2]))
         {
          CurrentPoint1 = 0;
          CurrentPoint2 = 0;
          ZeroClose1 = iClose(Symbol_1,Period(),iBarShift(Symbol_1,0,Time[i+1]));
          ZeroClose2 = iClose(Symbol_2,Period(),iBarShift(Symbol_2,0,Time[i+1]));         
         }
      
      CurrentPoint1 = iClose(Symbol_1,Period(),iBarShift(Symbol_1,0,Time[i])) - ZeroClose1;
      if(Revers) CurrentPoint2 = -1*(iClose(Symbol_2,Period(),iBarShift(Symbol_2,0,Time[i])) - ZeroClose2);
      else CurrentPoint2 = iClose(Symbol_2,Period(),iBarShift(Symbol_2,0,Time[i])) - ZeroClose2;

      Spread_Buf[i]  = (CurrentPoint1 / MarketInfo(Symbol_1, MODE_POINT) - CurrentPoint2 / MarketInfo(Symbol_2, MODE_POINT));
                              
      Buf_Up[i] = Spread_Buf[i];     
      Buf_Dw[i] = Spread_Buf[i];  
      if(Spread_Buf[i] < Spread_Buf[i+1]) Buf_Up[i] = EMPTY_VALUE;
      if(Spread_Buf[i] > Spread_Buf[i+1]) Buf_Dw[i] = EMPTY_VALUE; 
      i--;                          
     }


Сделал так:

int start()                         
  {
    int i, countedBars = IndicatorCounted();
        
    for(i = Bars - countedBars;i > 0;i--)    
//--------------------------------------------------------------------
   CurrentPoint1 = 0; 
   CurrentPoint2 = 0; 
   kVol1=MarketInfo(Symbol_1, MODE_TICKVALUE)/MarketInfo(Symbol_1, MODE_TICKSIZE);
   kVol2=MarketInfo(Symbol_2, MODE_TICKVALUE)/MarketInfo(Symbol_2, MODE_TICKSIZE);
             
   while(i>=0)                 
     {
      Symbol1_Buf[i] = MACD (Symbol_1, iBarShift(Symbol_1, 0, Time[i], FALSE));
      if(Revers) Symbol2_Buf[i] = -1*MACD (Symbol_2, iBarShift(Symbol_2, 0, Time[i], FALSE));
      else Symbol2_Buf[i] = MACD (Symbol_2, iBarShift(Symbol_2, 0, Time[i], FALSE));
      
      if((Symbol1_Buf[i+1]>Symbol2_Buf[i+1] && Symbol1_Buf[i+2]<=Symbol2_Buf[i+2]) ||
         (Symbol1_Buf[i+1]<Symbol2_Buf[i+1] && Symbol1_Buf[i+2]>=Symbol2_Buf[i+2]))
         {
          CurrentPoint1 = 0;
          CurrentPoint2 = 0;
          ZeroClose1 = iClose(Symbol_1,Period(),iBarShift(Symbol_1,0,Time[i+1]));
          ZeroClose2 = iClose(Symbol_2,Period(),iBarShift(Symbol_2,0,Time[i+1]));         
         }
      
      CurrentPoint1 = iClose(Symbol_1,Period(),iBarShift(Symbol_1,0,Time[i])) - ZeroClose1;
      if(Revers) CurrentPoint2 = -1*(iClose(Symbol_2,Period(),iBarShift(Symbol_2,0,Time[i])) - ZeroClose2);
      else CurrentPoint2 = iClose(Symbol_2,Period(),iBarShift(Symbol_2,0,Time[i])) - ZeroClose2;

      Spread_Buf[i]  = (CurrentPoint1 / MarketInfo(Symbol_1, MODE_POINT) - CurrentPoint2 / MarketInfo(Symbol_2, MODE_POINT));
                              
      Buf_Up[i] = Spread_Buf[i];     
      Buf_Dw[i] = Spread_Buf[i];  
      if(Spread_Buf[i] < Spread_Buf[i+1]) Buf_Up[i] = EMPTY_VALUE;
      if(Spread_Buf[i] > Spread_Buf[i+1]) Buf_Dw[i] = EMPTY_VALUE; 
      i--;                          
     }

После компилирования, ошибок нет, но индикатор показывает, только один длинный бар.

 
Krokus:

После компилирования, ошибок нет, но индикатор показывает, только один длинный бар.


 Ну в саму логику Вашего индюка вникать пока что у меня нет времени, но я Вам написал как правильно задавать цикл.

Кстати, не помешало бы упростить код, и сделать его более читабельным. И тогда проще будет его анализировать. Из-за этого бывает часто ошибки. Чем читабельнее код, и продуманнее названия переменых, тем лучше. 

 
hoz:


 Ну в саму логику Вашего индюка вникать пока что у меня нет времени, но я Вам написал как правильно задавать цикл.

Кстати, не помешало бы упростить код, и сделать его более читабельным. И тогда проще будет его анализировать. Из-за этого бывает часто ошибки. Чем читабельнее код, и продуманнее названия переменых, тем лучше. 


Буду разбираться... Спасибо.