如何编码? - 页 100

 

只有买入,没有卖出

创建一个有利可图的EA,但它可以是两倍的好(也许),因为现在只有买入,没有卖出订单。

有谁知道原因吗?

//+------------------------------------------------------------------+

//| 信号开始 |

//+------------------------------------------------------------------+

double sig_buy = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 0, 0) 。

double sig_sell = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 1, 0);

double Sg=iCustom(NULL,0, "RSIFilter_v1",5,5,0,1);

如果(sig_buy>0 && Sg>0) Order = SIGNAL_BUY;

如果(sig_sell>0 && Sg<0 ) Order = SIGNAL_SELL;

//+------------------------------------------------------------------+

//| 信号结束 |

//+------------------------------------------------------------------+

 

发布总的代码,有另一个问题...

第二步可能是你的iCustom()函数

panteraschoice:
创建了一个有利可图的EA,但它可以是两倍的好(也许),现在只有买入,没有卖出订单。

有谁知道原因吗?

//+------------------------------------------------------------------+

//| 信号开始 |

//+------------------------------------------------------------------+

double sig_buy = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 0, 0) 。

double sig_sell = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 1, 0);

double Sg=iCustom(NULL,0, "RSIFilter_v1",5,5,0,1);

如果(sig_buy>0 && Sg>0) Order = SIGNAL_BUY;

如果(sig_sell>0 && Sg<0 ) Order = SIGNAL_SELL;

//+------------------------------------------------------------------+

//|信号结束|

//+------------------------------------------------------------------+
 

放置和查看未来日期的对象?

你好,有谁知道MQL4是否支持将指标对象放置到未来并查看未来对象? 我试过ObjectMove到未来日期(没有错误返回),但显示停止在最后的刻度日期。 谢谢

 

如果你的意思是这样的话,MA有一个移位功能...。+2将使它向前滑动2个TF条。-2将向后滑动2。

 
IN10TION:
发布总的代码,还有一个问题......第二步可能是你的iCustom()函数。

#property link "https://www.forex-tsd.com"

外部int MagicNumber = 1001;

外部 bool EachTickMode = False;

外置双数 Lots = 0.01;

extern int Slippage = 4;

外部 bool StopLossMode = True;

External int StopLoss = 70;

外部 bool TakeProfitMode = True;

外来的int TakeProfit = 300;

外部 bool TrailingStopMode = True;

extern int TrailingStop = 25;

外置双倍最大风险 =0;//0.15

外置双倍递减系数 =3;

外置 int MaxOrders = 3000;

外部 bool UseHourTrade = False;

外置 int FromHourTrade = 8;

Extern int ToHourTrade = 18;

#define SIGNAL_NONE 0

#define SIGNAL_BUY 1

#define SIGNAL_SELL 2

#define SIGNAL_CLOSEBUY 3

#define SIGNAL_CLOSESELL 4

int BarCount;

int Current;

bool TickCheck = False;

//+------------------------------------------------------------------+

//| 专家初始化函数 |

//+------------------------------------------------------------------+

int init() {

BarCount = Bars;

如果(EachTickMode)Current = 0;否则Current = 1。

return(0);

}

//+------------------------------------------------------------------+

//| 专家去初始化功能|

//+------------------------------------------------------------------+

int deinit() {

return(0);

}

//+------------------------------------------------------------------+

//| 专家启动功能|

//+------------------------------------------------------------------+

int start() {

如果(UseHourTrade){

如果(!(Hour()>=FromHourTrade && Hour()<=ToHourTrade)) {

Comment("交易时间还没有到来!")。

return(0);

}

}

int Order = SIGNAL_NONE;

int Total, Ticket;

double StopLossLevel, TakeProfitLevel;

int digit = MarketInfo(Symbol(),MODE_DIGITS);

如果(EachTickMode && Bars != BarCount) EachTickMode = False;

Total = OrdersTotal();

订单 = SIGNAL_NONE;

//+------------------------------------------------------------------+

//| 信号开始 |

//+------------------------------------------------------------------+

double sig_buy = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 0, 0);

double sig_sell = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 1, 0);

double Sg=iCustom(NULL,0, "RSIFilter_v1",5,5,0,1);

如果(sig_buy>0 && Sg>0) Order = SIGNAL_BUY;

如果(sig_sell>0 && Sg<0 ) Order = SIGNAL_SELL;

//+------------------------------------------------------------------+

//| 信号结束 |

//+------------------------------------------------------------------+

//买入

if (Order == SIGNAL_BUY && ((EachTickMode && !TickCheck) || (! EachTickMode && (Bars != BarCount))))){

如果(ScanTrades() < MaxOrders) {

//检查自由保证金

如果(AccountFreeMargin() < (1000 * Lots)) {

Print("我们没有钱。Free Margin = ", AccountFreeMargin())。

return(0);

}

StopLossLevel = Ask - StopLoss * Point;

TakeProfitLevel = Ask + TakeProfit * Point;

Ticket = OrderSend(Symbol(), OP_BUY, LotsOptimized(),

NormalizeDouble(Ask,digit),

滑点。

NormalizeDouble(StopLossLevel,digit)。

NormalizeDouble(TakeProfitLevel,digit)。

"Buy(#" + MagicNumber + ")", MagicNumber, 0, DodgerBlue)。

如果(Ticket > 0) {

如果(OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES))Print("BUY订单打开 : ", OrderOpenPrice()); else Print("错误打开BUY订单:", GetLastError())。

}

如果(EachTickMode) TickCheck = True;

如果(!EachTickMode) BarCount = Bars;

return(0);

}

}

//卖出

如果(Order == SIGNAL_SELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount))))){

如果(ScanTrades() < MaxOrders) {

//检查自由保证金

如果(AccountFreeMargin() < (1000 * Lots)) {

Print("我们没有钱。Free Margin = ", AccountFreeMargin())。

return(0);

}

StopLossLevel = Bid + StopLoss * Point;

TakeProfitLevel = Bid - TakeProfit * Point;

Ticket = OrderSend(Symbol(), OP_SELL, LotsOptimized(),

NormalizeDouble(Bid,digit)。

滑点。

NormalizeDouble(StopLossLevel,digit)。

NormalizeDouble(TakeProfitLevel,digit)。

"Sell(#" + MagicNumber + ")", MagicNumber, 0, DeepPink)。

如果(Ticket > 0) {

如果(OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES))Print("卖出订单 打开 : ", OrderOpenPrice()); else Print("错误打开卖出订单:", GetLastError())。

}

如果(EachTickMode) TickCheck = True;

如果(!EachTickMode) BarCount = Bars;

return(0);

}

}

//检查位置

for (int i = 0; i < Total; i ++) {

OrderSelect(i, SELECT_BY_POS, MODE_TRADES)。

如果(OrderType() <= OP_SELL && OrderSymbol() == Symbol() ) {

如果(OrderType() == OP_BUY && OrderMagicNumber() ==MagicNumber ) {

//平仓

if (Order == SIGNAL_CLOSEBUY && ((EachTickMode && !TickCheck) || (! EachTickMode && (Bars != BarCount))))){

OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, MediumSeaGreen)。

如果(EachTickMode) TickCheck = True;

if (!EachTickMode) BarCount = Bars;

return(0);

}

//拖曳止损

如果(TrailingStopMode && TrailingStop > 0) {

如果(Bid - OrderOpenPrice() > Point * TrailingStop) {

如果(OrderStopLoss() < Bid - Point * TrailingStop) {

OrderModify(OrderTicket(), OrderOpenPrice(), Bid - Point * TrailingStop, OrderTakeProfit(), 0, MediumSeaGreen) 。

if (!EachTickMode) BarCount = Bars;

return(0);

}

}

}

} else {

如果(OrderType()==OP_SELL && OrderMagicNumber()==MagicNumber)

{

//平仓

如果(Order == SIGNAL_CLOSESELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))))

{

OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, DarkOrange)。

如果(EachTickMode) TickCheck = True;

如果(!EachTickMode) BarCount = Bars;

return(0);

}

//拖曳止损

如果(TrailingStopMode && TrailingStop > 0)

{

如果((OrderOpenPrice() - Ask) > (Point * TrailingStop)) {

如果((OrderStopLoss() > (Ask + Point * TrailingStop))|| (OrderStopLoss() == 0)) {

OrderModify(OrderTicket(), OrderOpenPrice(), Ask + Point * TrailingStop, OrderTakeProfit(), 0, DarkOrange) 。

if (!EachTickMode) BarCount = Bars;

return(0);

}

}

}

}}

}

}

if (!EachTickMode) BarCount = Bars;

return(0);

}

int ScanTrades()

{

int total = OrdersTotal();

int numords = 0;

for(int cnt=0; cnt<total; cnt++)

{

OrderSelect(cnt, SELECT_BY_POS)。

if(OrderSymbol() == Symbol() && OrderType() <=OP_SELLSTOP && OrderMagicNumber() == MagicNumber)

numords++;

}

return(numords);

}

//bool ExistPositions() {

// for (int i=0; i<OrdersTotal(); i++) {

// 如果(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {

// 如果(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) {

// 返回(True)。

// }

// }

// }

// return(false);

//}

double LotsOptimized()

{

double lot=Lots;

int orders=HistoryTotal(); // 历史订单总数

int losses=0; // 亏损订单的数量,没有休息时间

//---- 选择手数大小

if(MaximumRisk>0)lot=NormalizeDouble(Lots*AccountFreeMargin()*MaximumRisk/1000.0,1);

//----,计算无休止的损失订单的数量

如果(DecreaseFactor>0)

{

for(int i=orders-1;i>=0;i--)

{

if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("历史错误!"); break; }

如果(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) 继续。

//----

if(OrderProfit()>0) break;

if(OrderProfit()<0) losses++;

}

如果(损失>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);

}

//---- 返回手数大小

如果(lot<0.1) lot=0.1;

return(lot);

}

//+------------------------------------------------------------------+

 

你是否得到任何错误代码 或其他东西(在回测中),给你提示出了什么问题?

panteraschoice:
#属性链接 "https://www.forex-tsd.com"

外部int MagicNumber = 1001;

外部 bool EachTickMode = False;

extern double Lots = 0.01;

extern int Slippage = 4;

extern bool StopLossMode = True;

External int StopLoss = 70;

外部 bool TakeProfitMode = True;

外来的int TakeProfit = 300;

外部 bool TrailingStopMode = True;

extern int TrailingStop = 25;

外置双倍最大风险 =0;//0.15

外置双倍递减系数 =3;

外置 int MaxOrders = 3000;

外部 bool UseHourTrade = False;

外置 int FromHourTrade = 8;

Extern int ToHourTrade = 18;

#define SIGNAL_NONE 0

#define SIGNAL_BUY 1

#define SIGNAL_SELL 2

#define SIGNAL_CLOSEBUY 3

#define SIGNAL_CLOSESELL 4

int BarCount;

int Current;

bool TickCheck = False;

//+------------------------------------------------------------------+

//| 专家初始化函数 |

//+------------------------------------------------------------------+

int init() {

BarCount = Bars;

如果(EachTickMode)Current = 0;否则Current = 1。

return(0);

}

//+------------------------------------------------------------------+

//| 专家去初始化功能|

//+------------------------------------------------------------------+

int deinit() {

return(0);

}

//+------------------------------------------------------------------+

//| 专家启动功能|

//+------------------------------------------------------------------+

int start() {

如果(UseHourTrade){

如果(!(Hour()>=FromHourTrade && Hour()<=ToHourTrade)) {

Comment("交易时间还没有到来!")。

return(0);

}

}

int Order = SIGNAL_NONE;

int Total, Ticket;

double StopLossLevel, TakeProfitLevel;

int digit = MarketInfo(Symbol(),MODE_DIGITS);

如果(EachTickMode && Bars != BarCount) EachTickMode = False;

Total = OrdersTotal();

订单 = SIGNAL_NONE;

//+------------------------------------------------------------------+

//| 信号开始 |

//+------------------------------------------------------------------+

double sig_buy = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 0, 0);

double sig_sell = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 1, 0);

double Sg=iCustom(NULL,0, "RSIFilter_v1",5,5,0,1);

如果(sig_buy>0 && Sg>0) Order = SIGNAL_BUY;

如果(sig_sell>0 && Sg<0 ) Order = SIGNAL_SELL;

//+------------------------------------------------------------------+

//| 信号结束 |

//+------------------------------------------------------------------+

//买入

if (Order == SIGNAL_BUY && ((EachTickMode && !TickCheck) || (! EachTickMode && (Bars != BarCount))))){

如果(ScanTrades() < MaxOrders) {

//检查自由保证金

如果(AccountFreeMargin() < (1000 * Lots)) {

Print("我们没有钱。Free Margin = ", AccountFreeMargin())。

return(0);

}

StopLossLevel = Ask - StopLoss * Point;

TakeProfitLevel = Ask + TakeProfit * Point;

Ticket = OrderSend(Symbol(), OP_BUY, LotsOptimized(),

NormalizeDouble(Ask,digit),

滑点。

NormalizeDouble(StopLossLevel,digit)。

NormalizeDouble(TakeProfitLevel,digit)。

"Buy(#" + MagicNumber + ")", MagicNumber, 0, DodgerBlue)。

如果(Ticket > 0) {

如果(OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES))Print("BUY订单打开 : ", OrderOpenPrice()); else Print("错误打开BUY订单:", GetLastError())。

}

如果(EachTickMode) TickCheck = True;

如果(!EachTickMode) BarCount = Bars;

return(0);

}

}

//卖出

如果(Order == SIGNAL_SELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount))))){

如果(ScanTrades() < MaxOrders) {

//检查自由保证金

如果(AccountFreeMargin() < (1000 * Lots)) {

Print("我们没有钱。Free Margin = ", AccountFreeMargin())。

return(0);

}

StopLossLevel = Bid + StopLoss * Point;

TakeProfitLevel = Bid - TakeProfit * Point;

Ticket = OrderSend(Symbol(), OP_SELL, LotsOptimized(),

NormalizeDouble(Bid,digit)。

滑点。

NormalizeDouble(StopLossLevel,digit)。

NormalizeDouble(TakeProfitLevel,digit)。

"Sell(#" + MagicNumber + ")", MagicNumber, 0, DeepPink)。

如果(Ticket > 0) {

如果(OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES))Print("卖出订单打开 : ", OrderOpenPrice()); else Print("错误打开卖出订单:", GetLastError())。

}

如果(EachTickMode) TickCheck = True;

如果(!EachTickMode) BarCount = Bars;

return(0);

}

}

//检查位置

for (int i = 0; i < Total; i ++) {

OrderSelect(i, SELECT_BY_POS, MODE_TRADES)。

如果(OrderType() <= OP_SELL && OrderSymbol() == Symbol() ) {

如果(OrderType() == OP_BUY && OrderMagicNumber() ==MagicNumber ) {

//平仓

if (Order == SIGNAL_CLOSEBUY && ((EachTickMode && !TickCheck) || (! EachTickMode && (Bars != BarCount))))){

OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, MediumSeaGreen)。

如果(EachTickMode) TickCheck = True;

if (!EachTickMode) BarCount = Bars;

return(0);

}

//拖曳止损

如果(TrailingStopMode && TrailingStop > 0) {

如果(Bid - OrderOpenPrice() > Point * TrailingStop) {

如果(OrderStopLoss() < Bid - Point * TrailingStop) {

OrderModify(OrderTicket(), OrderOpenPrice(), Bid - Point * TrailingStop, OrderTakeProfit(), 0, MediumSeaGreen) 。

if (!EachTickMode) BarCount = Bars;

return(0);

}

}

}

} else {

如果(OrderType()==OP_SELL && OrderMagicNumber()==MagicNumber)

{

//平仓

如果(Order == SIGNAL_CLOSESELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))))

{

OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, DarkOrange)。

如果(EachTickMode) TickCheck = True;

如果(!EachTickMode) BarCount = Bars;

return(0);

}

//拖曳止损

如果(TrailingStopMode && TrailingStop > 0)

{

如果((OrderOpenPrice() - Ask) > (Point * TrailingStop)) {

如果((OrderStopLoss() > (Ask + Point * TrailingStop))|| (OrderStopLoss() == 0)) {

OrderModify(OrderTicket(), OrderOpenPrice(), Ask + Point * TrailingStop, OrderTakeProfit(), 0, DarkOrange) 。

if (!EachTickMode) BarCount = Bars;

return(0);

}

}

}

}}

}

}

if (!EachTickMode) BarCount = Bars;

return(0);

}

int ScanTrades()

{

int total = OrdersTotal();

int numords = 0;

for(int cnt=0; cnt<total; cnt++)

{

OrderSelect(cnt, SELECT_BY_POS)。

if(OrderSymbol() == Symbol() && OrderType() <=OP_SELLSTOP && OrderMagicNumber() == MagicNumber)

numords++;

}

return(numords);

}

//bool ExistPositions() {

// for (int i=0; i<OrdersTotal(); i++) {

// 如果(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {

// 如果(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) {

// 返回(True)。

// }

// }

// }

// return(false);

//}

double LotsOptimized()

{

double lot=Lots;

int orders=HistoryTotal(); // 历史订单总数

int losses=0; // 亏损订单的数量,没有休息时间

//---- 选择手数大小

if(MaximumRisk>0)lot=NormalizeDouble(Lots*AccountFreeMargin()*MaximumRisk/1000.0,1);

//----,计算无休止的损失订单的数量

如果(DecreaseFactor>0)

{

for(int i=orders-1;i>=0;i--)

{

if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("历史错误!"); break; }

如果(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) 继续。

//----

if(OrderProfit()>0) break;

if(OrderProfit()<0) losses++;

}

如果(损失>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);

}

//---- 返回手数大小

如果(lot<0.1) lot=0.1;

return(lot);

}

//+------------------------------------------------------------------+
 

我现在只用RSIFilter做回测,我确实使用了RSIMixFilter,在这个主题的几个帖子中,我发布了那个指标,我确实得到了BUYS和SELLS,所以做订单的逻辑BUY和SELL是确定的,问题是你的iCustom信号...

RSIMixFilter,不在这个主题里,对不起,它在ASK 这里。

panteraschoice:
创建了一个有利可图的EA,但它可以是两倍的好(也许),现在只有买入,没有卖出订单。

有谁知道为什么?

//+------------------------------------------------------------------+

//| 信号开始 |

//+------------------------------------------------------------------+

double sig_buy = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 0, 0);

double sig_sell = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 1, 0);

double Sg=iCustom(NULL,0, "RSIFilter_v1",5,5,0,1);

如果(sig_buy>0 && Sg>0) Order = SIGNAL_BUY;

如果(sig_sell>0 && Sg<0 ) Order = SIGNAL_SELL;

//+------------------------------------------------------------------+

//|信号结束|

//+------------------------------------------------------------------+
 

我做了一些回测,欧元兑美元H1从2007年4月到现在,只用了这个RSIMixFilter...

90%的建模质量,不知道为什么不显示。

panteraschoice:
创建了一个有利可图的EA,但它可以是两倍的好(也许),现在只有买入,没有卖出订单。

有谁知道原因吗?

//+------------------------------------------------------------------+

//| 信号开始 |

//+------------------------------------------------------------------+

double sig_buy = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 0, 0) 。

double sig_sell = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 1, 0);

double Sg=iCustom(NULL,0, "RSIFilter_v1",5,5,0,1);

如果(sig_buy>0 && Sg>0) Order = SIGNAL_BUY;

如果(sig_sell>0 && Sg<0 ) Order = SIGNAL_SELL;

//+------------------------------------------------------------------+

//|信号结束|

//+------------------------------------------------------------------+
附加的文件:
 

这个回溯测试,是买入和卖出还是只有其中之一?在我身上,我只得到了买入(或者在我改变代码时只得到了卖出)。

我真的没有看到任何显示错误的东西。

 
IN10TION:
我现在只用RSIFilter做回测,我确实使用了RSIMixFilter,在这个主题的几个帖子中,我发布了那个指标,我确实得到了BUYS和SELLS,所以做订单BUY和SELL的逻辑是好的,问题是你的iCustom信号...

那么这样做可以吗?

double Sg=iCustom(NULL,0, "RSIFilter_v1",5,5,0,1);

if ( Sg>0 ) Order = SIGNAL_BUY;

如果(Sg<0 ) Order = SIGNAL_SELL;