新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 252

 

>err=StringToInteger((string)err)

这应该被载入史册;-)

最初在err中你显然从GetLastError()中得到了int。将错误代码 转换成可读描述 ErrorDescription(err); 前提是#include <stdlib.mqh>被启用。

但它的写法却让人很不爽。

PS/ 而且不要学习MQL编程。MQL 4和5是特定平台的目标语言。

 

你能告诉我是否可以这样写吗?它不愿意打开交易。也许计算的数字格式不对?或者代码中的其他缺陷?


double TakeLong(double shp)

{

int CurrentDayRange=0, fiveDayATR=0, take=0;

双TP_ATR=0。

//////支点输入

双P, S1, R1, S2, R2, S3, R3。

double LastHigh, LastLow, x;

int counted_bars = IndicatorCounted()。

int limit, i;

shp=iHigh(Symbol(),PERIOD_D1,0)。


//---- 枢轴指标计算

如果(counted_bars == 0)

{

x = Period()。

如果(x > 240)

返回(-1)。

}

如果(counted_bars < 0)

返回(-1)。

limit = (Bars - counted_bars) - 1;

//----

for(i = limit; i >= 0; i--)

{

如果(High[i+1] > LastHigh)

LastHigh = High[i+1];

//----

如果(Low[i+1] < LastLow)

LastLow=Low[i+1]。

如果(TimeDay(Time[i]) !=TimeDay(Time[i+1])

{

P = (LastHigh + LastLow + Close[i+1]) / 3;

R1 = (2*P) - LastLow。

S1 = (2*P) - LastHigh;

R2 = P + (LastHigh - LastLow)。

S2 = P - (LastHigh - LastLow)。

R3=(2*P)+(LastHigh-(2*LastLow))。

S3 = (2*P) - ((2* LastHigh) - LastLow)。

LastLow = Open[i];

LastHigh = Open[i];

}

}

////ATR计算

for (i=1;i<6;i++)

{ if(iHigh(NULL, PERIOD_D1, i)-iLow(NULL, PERIOD_D1, i)>0) FiveDayATR += (iHigh(NULL, PERIOD_D1, i)-iLow(NULL, PERIOD_D1, i)); }

FiveDayATR = NormalizeDouble(FiveDayATR/5,Digits())。

CurrentDayRange = (iHigh(NULL, PERIOD_D1, i)-iLow(NULL, PERIOD_D1, i))。

如果(FiveDayATR-CurrentDayRange>0) TP_ATR=Ask+FiveDayATR-CurrentDayRange; 否则TP_ATR=0。


如果(Bid>R1 && TP_ATR==0) take=shp;

否则如果(Bid<R1 && R1<TP_ATR)take=R1;

否则take=TP_ATR。

return(take)。

}

 
forexpipsrunner: 请告诉我你能不能这样写,它不愿意打开交易

建议的代码看起来像一个指标。交易是由专家顾问或脚本开启的。指标中不允许 调用OrderSend函数指示器可以报警--在适当的地方插入警报功能的呼叫或声音

 
STARIJ:

拟议的代码与指标类似。交易是由专家顾问或脚本开启的。指标中禁止 调用OrderSend函数指示器可能发出信号--在适当的地方插入警报功能调用或声音


这是TP的定义代码,它将结果发送到OrderSend。如果没有这个复杂的算法,交易被发送,但没有办法发送。我调用函数 TP = TakeLong(SHP)。

 
forexpipsrunner: 这是TP的定义代码,它给OrderSend提供了结果,如果没有这个算法,交易就会被发送,没有办法

调试有很多方法--在确定存在错误的情况下寻找错误的过程。第一个是F5--在MetsEditor中开始调试。 2)使用Alerts来跟踪执行。3和4)输出调试信息到文本标签和Comment函数。选择方便的方式,调试这个简单的功能 - 然后你就会成为一个程序员。一个有数千行的程序被认为是复杂的。

 
forexpipsrunner:

你能不能告诉我,你能不能这样写。它不想打开交易,也许计算的数字格式不对?或者代码中的其他缺陷?


int take=0 - 你返回一个整数,这个变量不应该是一个双数吗?
 
你好!我想做一个 "轨道 "图案,但我搞不清楚烛台的体量大小....。

我计算烛台主体的大小如下:
MathAbs( Close1[i] - Open1[i] ) / Point + 1
MathAbs( Close2[i] - Open2[i] ) / Point + 1

在完整的代码中看起来是这样的

double Close1 =iClose(Symbol(), 0, i);
double Open1 = iOpen(Symbol(), 0, i);
double Close2 = iClose(Symbol(), 0, i+1);
double Open2 = iOpen(Symbol(), 0, i+1) 。

MathAbs( Close1[i] - Open1[i] ) / Point + 1
MathAbs( Close2[i] - Open2[i] ) / Point + 1

if (Close1 < Open1 && Close2 > Open2){
BUY();
}
if ( Close1 > Open1 && Close2 < Open2){
SELL( );
}

这是否正确?我怎样才能使它发挥作用?
 
sviter-pro:   你好,我想做一个 "轨道 "图案,但我搞不清楚蜡烛体的大小....。

你在M1模拟账户 上试过吗?你能得到什么?

 
STARIJ:

你在M1模拟账户 上试过吗?结果是什么?

没有任何效果....(()
 
void trailing(string symbol,string comment,int magic,int trail_p)
  {
   if(symbol==NULL) symbol=Symbol();
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==symbol && OrderComment()==comment && OrderMagicNumber()==magic)
           {
            switch(OrderType())
              {
               case OP_BUY:
                  if(OrderOpenPrice()+(trail_p*Point)<Ask && OrderStopLoss()+(trail_p*Point)<Ask)
                    {
                     if(!OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss()+(trail_p*Point),OrderTakeProfit(),OrderExpiration(),clrNONE))
                       {
                        Print("OrderModify завершилась с ошибкой #",GetLastError());
                       }
                    }
                  break;
               case OP_SELL:
                  if(OrderOpenPrice()-(trail_p*Point)>Bid && OrderStopLoss()-(trail_p*Point)>Bid)
                    {
                     if(!OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss()-(trail_p*Point),OrderTakeProfit(),OrderExpiration(),clrNONE))
                       {
                        Print("OrderModify завершилась с ошибкой #",GetLastError());
                       }
                    }
                  break;
              }
           }
        }
        Comment("StopLoss=",OrderStopLoss());
     }
  }

你能告诉我,为什么每次打勾 都会触发拖网?