如何编码? - 页 135

 

编译时出错

大家好

我有以下错误。

'<'-比较中的不同类型

我试着修改下面的行。

(NonLagMA_2D_S2&&D_S2Switch==1)

(Price_NowD_S2&&D_S2Switch==1)

问题出在哪里?

对不起,不能上传mql-file。这不是我的脚本

 
你用不同类型的东西进行比较,所以必须是整数与整数,双数与双数,字符串与字符串......像这样......

解释

Badguy:
大家好

我有以下错误。

'<'-比较中的不同类型

我试着修改下面的行。

(NonLagMA_2D_S2&&D_S2Switch==1)

(Price_NowD_S2&&D_S2Switch==1)

问题出在哪里?

对不起,不能上传mql-file。这不是我的脚本
 

通过神奇的数字关闭多个位置 - 帮助

大家好。

我是mt4编程的新手,下面是我的第一个EA。这个EA的目的是关闭所有的头寸,无论任何货币对都基于相同的魔法数字。

比方说,在8675310号魔法下,我有2个EURUSD和USDCFh头寸。当它达到一定的利润目标时,它将能够关闭所有这些货币对。

这个EA的问题是。

打开交易#1 EURUSD (能够关闭)

打开交易#2 USDCFh (无法关闭)

它不能关闭交易#2。

有什么想法吗?

谢谢

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

//| Closing_Trade_By_Magic_No_v1 .mq4 |/|我的

//|我的

//|外汇交易软件。外汇交易平台MetaTrader 4| |

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

#property copyright "Mine"

#property link "http://www.metaquotes.net"

//---- 输入参数

extern int MagicNumber1=8675310;

extern int Profit1=10;

extern int MagicNumber2=8675311;

extern int Profit2=15;

extern int MagicNumber3=8675312;

extern int Profit3=15;

extern int MagicNumber4=8675313;

extern int Profit4=15;

extern int MagicNumber5=8675314;

extern int Profit5=15;

extern int MagicNumber6=0;

extern int Profit6=10;

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

//|专家初始化函数 |

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

int init()

{

onScreenComment(98, "Tengak Initialize.")。

//----

//----

return(0);

}

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

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

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

int deinit()

{

//----

//----

return(0);

}

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

//|专家启动功能|

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

int start()

{

string myMessage=""。

myMessage = myMessage + ProfitLossMonitor(1,MagicNumber1,Pr ofit1, myMessage);

myMessage = myMessage + ProfitLossMonitor(2,MagicNumber2,Pr ofit2,myMessage);

myMessage = myMessage + ProfitLossMonitor(3,MagicNumber3,Pr ofit3,myMessage);

myMessage = myMessage + ProfitLossMonitor(4,MagicNumber4,Pr ofit4,myMessage);

myMessage = myMessage + ProfitLossMonitor(5,MagicNumber5,Pr ofit5,myMessage);

myMessage = myMessage + ProfitLossMonitor(6,MagicNumber6,Pr ofit6,myMessage);

onScreenComment(98,myMessage)。

//----

//----

返回(0)。

}

string ProfitLossMonitor(int myGroupNumber,int myMagicNumber, int myProfit,string myMessage )

{

int total = OrdersTotal();

double MyCurrentProfit=0;

字符串 MyOrderNo=""。

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

{

OrderSelect(cnt,SELECT_BY_POS,MODE_ TRADES)。

如果(OrderMagicNumber() == myMagicNumber)

{

MyCurrentProfit += OrderProfit()。

MyOrderNo= MyOrderNo + "," + OrderTicket();

}

}

如果(MyCurrentProfit>=myProfit)

CloseAll(myMagicNumber);

myMessage="Group Position #" + myGroupNumber + " " + myMagicNumber + "=" + myProfit + "(" + DoubleToStr(MyCurrentProfit,2) + " " + MyOrderNo + ") "+ "\n" ;

返回(myMessage)。

}

void CloseAll(int myMagicNumber)

{

int total = OrdersTotal();

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

{

OrderSelect(cnt,SELECT_BY_POS,MODE_ TRADES)。

如果(OrderMagicNumber() == myMagicNumber)

如果(OrderType()==OP_BUY)

OrderClose(OrderTicket(),OrderLots( ),Bid,5,Violet)。

如果(OrderType()==OP_SELL)

OrderClose(OrderTicket(),OrderLots( ), Ask,5,Violet)。

}

}

void onScreenComment(int myEvent, string myComment)

{

switch (myEvent)

{

case 98:Comment(myComment); break;

}

}

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

编辑/删除信息

 
这个EA的问题是,

Open Transaction # 1 EURUSD (able to close)

打开交易#2USDCFh(无法关闭)

它无法关闭交易#2。

有什么想法吗?

我假设在你试图关闭订单时,你是在欧元兑美元图表上运行EA,因为这些头寸关闭得很好。当你的代码试图关闭美元兑瑞郎头寸,它使用了错误的买入和卖出价,它使用的收盘价来自EA所连接的货币对,而不是占有符号的价格。如果你试图从一个与该货币不匹配的图表中关闭另一个货币对,你必须在试图关闭它之前首先检索出正确的价格。

凯特

编辑:另外,在这种情况下,货币USDCHF必须在你试图检索正确的报价以关闭订单时显示在你的市场观察窗口。如果美元兑瑞郎没有出现在市场观察窗口中,你将无法获得该货币对的任何报价。

 

谢谢cockeyedcowboy!。

"在试图关闭它之前,你必须首先重新获得正确的价格"。

你能分享一下能实现上述需求的语法或函数 吗。

 

如何在下一栏前不进行交易

我第一次尝试编程,但有一个问题。

- 如果我在一个条形图中关闭交易,我只能在新条形图打开时打开新的交易。

我尝试了以下方法。

datetime time0=0。

int start()

if (time0 == Time[0]) return;

{

"程序代码"

}

time0 = Time[0];

return(0);

如果我把这一点拿掉,我就会在不同的条形图中得到多个条目。有了它,我得到的条目要少得多(从回测 中的70条到4条),但有条目丢失。

有没有人知道我做错了什么。

谢谢。

 

你可以使用下面的NewBar()函数

如if(NewBar(){ ........这里的编程

bool NewBar() {

static datetime LastTime = 0;

if (Time[0] != LastTime) {

LastTime = Time[0];

return (true);

} else

return (false);

}

如果你一次只想要一个订单,你可能也想测试一下未结订单。

希望这有帮助。

拉克斯

 

拉克斯

谢谢你对此事的帮助。

我想我已经弄清楚了程序上发生的事情。

我之前是在开始时检查新条形,所以程序只是检查新条形的第一个刻度,看它是否与我的信号一致,而没有检查其他刻度。这就是为什么在回测 中很少有交易信号出现。

我现在已经正确地放置了代码,(即我的订单结束指令的位置)它似乎工作得很好。

我的想法是否正确?

 

请帮助更新专家的代码。

有一个简单的专家。代码也很清晰和简单,但我有一个大问题--专家只有一次尝试打开/关闭订单。

谁能帮助解决这个问题?

专家必须尝试5-10次来打开/关闭订单。

也许n=尝试的次数,请不要用 "while"。

非常感谢。

附加的文件:
test.mq4  9 kb
 

我的 "亏损后调整手数 "的代码,需要帮助,谢谢。

我的代码是 "亏损后调整手数",但在测试过程中出现了"ArraySort函数 的起始位置0不正确 "的错误按摩。有谁能帮我解决这个问题?

double AdjtLotsByWinRate( int magicnumber,double NormLots)

{

int i,counter;

int ProfitAndTime[][2];

double Profits[];

//----

ArrayResize(ProfitAndTime,OrdersHistoryTotal());

for (i=0;i<OrdersHistoryTotal();i++)

{

if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))

{

if (OrderType()<=OP_SELL && OrderMagicNumber()==magicnumber ) // 0 OP_BUY 1 OP_SELL 2 OP_BUYLIMIT 3 OP_SELLLIMIT 4 OP_BUYSTOP 5 OP_SELLSTOP

{

ProfitAndTime[counter][0]=OrderCloseTime();

ProfitAndTime[counter][1]=OrderProfit();

counter++;

}

}

}

ArrayResize(ProfitAndTime,counter);

ArrayResize(Profits,counter);

ArraySort(ProfitAndTime);

for (i=0;i<counter;i++)

{

Profits=ProfitAndTime[1];

}

//Print(Profits);

int err=GetLastError();

int WinRate_N=0,WinRate_A=5;

double WinRate;

for (i=counter;i<counter-WinRate_A+1;i--)

{

if (Profits>0){

WinRate_N=WinRate_N+1;

}

else if (Profits<0)

{

WinRate_N=WinRate_N-1;

}

else

{

WinRate_N=WinRate_N+0;

}

}

WinRate=WinRate_N/WinRate_A;

double NewLots;

if (WinRate>=0.7)

{

NewLots=NormLots*1.5;

}

else if (WinRate>=0.5 && WinRate<0.7)

{

NewLots=NormLots*1;

}

else if (WinRate>=0.3 && WinRate<0.5)

{

NewLots=NormLots*0.5;

}

else //if (WinRate<0.3)

{

NewLots=NormLots*0.1;

}

return(NewLots);

}

原因: