任何菜鸟问题,为了不给论坛添乱。专业人士,不要路过。没有你就无处可去 - 6. - 页 11

 
AndEv:
下午好。有两个坐标为(x1,y1)和(x2,y2)的点。如何用这两点来构造一个对数基础不是自然数的对数函数?似乎我需要使用反函数(),但我不知道如何使其成为对角线。如果有人遇到过这个问题,请告知。我在此表示感谢。

很简单,除以你的对数的基数。也就是说,如果你想要二度的对数x,你就用对数x除以对数2,就得到二度的对数x。
[Deleted]  
gyfto:

很简单,除以你的对数的基数。也就是说,如果你想要二度的对数x,你就用对数x除以对数2,就得到二度的对数x
我不太明白。我的意思是,MT4的常规对数功能只计算一个数字的自然对数。MT4中没有其他对数功能。你可以使用反函数,即MathPow,但它需要镜像到对角线上。我想不出有什么更简单的方法可以做到这一点。
 
Fox_RM:

我可以澄清一下你说的不按市场价格出售是什么意思吗?有了SELLLIMIT和BUYLIMIT,一切都正确了。

进入编辑区,阅读什么是待处理订单......所有的问题都会消失。
 
hoz:

你应该去编辑并阅读什么是待定订单......然后所有的问题都会消失。


卖出限制- 从上边界卖出,买入限制 - 从下边界买入。全部

对的,有了待定的订单,这不是重点。

 
你在代码中的所有订单都是市场订单
 
AndEv:
我不太明白。我的意思是,MT4的常规对数功能只计算一个数字的自然对数。MT4中没有其他对数功能。你可以使用反函数,即MathPow,但它必须镜像到对角线上。我想不出有什么更简单的方法了。 。


关于这个?

幂函数的逆函数是同一基础上的对数函数。为了得到所需基础a 上的对数函数,你需要用MathLog(x)除以MathLog(a)。

[Deleted]  
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:


好吧,我还没有时间去研究你的指标的逻辑,但我给你写了如何正确设置循环。

顺便说一下,简化代码,使其更易读也无妨。然后就会更容易分析了。这往往是出错的原因。代码的可读性越高,变量的名称越好,就越好。


我将研究这个问题。谢谢你。