编码帮助 - 页 238

 

是否有机会增加选择的选项?

比如说。

分开,购买,和单独销售

修改一下。BE全部买入0,或+1,或+2点,或全部卖出BE 0,1或2点?

有可能吗?

be.mq4

附加的文件:
be.mq4  1 kb
 

你好,Mladen ,

谁能告诉我我做错了什么,我主要是用FX Gen写我的EA,用mq4编译器和在线论坛上的例子编写代码,我试图用代码编写我的策略以方便交易,我已经能够用这个代码成功选择最后一笔订单。

空白的OpenNewTrade()

{ datetime lastTime = 0;

int lastTicket = -1; // None open.

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

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

{

如果(OrderSymbol() == Symbol() && OrderMagicNumber() == OrderId && OrderOpenTime() >= lastTime && OrderTicket() > lastTicket )

{

lastTime = OrderOpenTime();

lastTicket = OrderTicket()。

如果(OrderType() == OP_BUY || OrderType() == OP_SELL

&& Ask - OrderOpenPrice() >= Grid*PipValue*Point

{

{

BuyOrder()。

}

}

如果(OrderType() == OP_BUY || OrderType() == OP_SELL

&& OrderOpenPrice() - Bid >= Grid*PipValue*Point

{

{

SellOrder();

}

}

}

return(lastTicket)。

}

否则

Print("OrderSelect()错误 - ", ErrorDescription(GetLastError()))。

}

你能看一下这段代码吗?我试图用日期时间和订单票据先删除最古老的订单,例如,如果打开的订单>2,就删除最古老的订单。

//-------------------------------------------------------------

// Etasoft Inc.外汇EA和脚本生成器4.1版EA

//-------------------------------------------------------------

// 关键词。MT4,外汇EA生成器,创建EA,专家顾问开发者

#property copyright "Copyright © 2011, Etasoft Inc.外汇EA生成器 v4.1"

#property link

#include

#include

//导出的变量

extern int OrderId = 1;

extern int Slippage = 2;

extern double Lots = 0.01;

extern int MaxOrdersAllowed = 2;//允许操作买入和操作卖出

extern int Grid = 10; // 与开仓订单的总距离(点数)。

Extern string EAComment = "564 testing";

// 本地变量

double PipValue=1; // 这个变量是用来支持5位数的经纪商的。

bool Terminated = false;

string LF = "\n"; // 在你需要换行的自定义或实用程序块中使用这个变量

int NDigits = 4; // 主要用于Flex类型块中的NormalizeDouble。

int ObjCount = 0; // 计算图表上创建的所有对象,允许创建具有唯一名称的对象

int current = 0;

int init()

{

NDigits = Digits;

if (false) ObjectsDeleteAll(); // 清除图表

Comment(""); // 清除图表

}

// 专家开始

int start()

{

如果(Bars < 10)

{

Comment("没有足够的条数")。

返回(0)。

}

如果(Terminated == true)

{

Comment("EA终止了。")。

返回(0)。

}

OnEveryTick1();

}

空白 OnEveryTick1()

{

如果(true == false && false)PipValue = 10。

如果(true && (NDigits == 3 || NDigits == 5))PipValue = 10。

IfOrderDoesNotExist2()。

IfOrderDoesNotExist4();

最大订单()。

}

空白 IfOrderDoesNotExist2()

{

bool exists = false;

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

如果(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)

{

如果(OrderType() == OP_BUYSTOP && OrderSymbol() == Symbol() && OrderMagicNumber() == 1)

{

存在 = 真。

}

}

否则

{

Print("OrderSelect()错误 - ", ErrorDescription(GetLastError()))。

}

如果(existence == false)

{

BuyPendingOrder()。

}

}

void IfOrderDoesNotExist4()

{

bool exists = false;

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

如果(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)

{

如果(OrderType() == OP_SELLSTOP && OrderSymbol() == Symbol() && OrderMagicNumber() == 1)

{

存在 = 真。

}

}

否则

{

Print("OrderSelect()错误 - ", ErrorDescription(GetLastError()))。

}

如果(existence == false)

{

SellPendingOrder()。

}

}

空白的BuyPendingOrder()

{

int expire = TimeCurrent() + 60 * 0;

double price = NormalizeDouble((Ask-((Ask-Bid)/2), NDigits) + Grid*PipValue*Point;

双重SL = 价格 - 0*PipValue*Point。

如果(0 == 0)SL = 0。

双重TP = 价格 + 0*PipValue*Point。

如果(0 == 0)TP = 0。

如果(0 == 0)expire = 0。

int ticket = OrderSend(Symbol(), OP_BUYSTOP, Lots, price, Slippage, SL, TP, EAComment, OrderId, expire, Blue) 。

如果(ticket == -1)

{

Print("OrderSend() error - ", ErrorDescription(GetLastError()))。

}

}

void SellPendingOrder()

{

int expire = TimeCurrent() + 60 * 0;

double price = NormalizeDouble((Bid+((Ask-Bid)/2)), NDigits) - Grid*PipValue*Point;

双重 SL = 价格 + 0*PipValue*Point。

如果(0 == 0)SL = 0。

双重TP = 价格 - 0*PipValue*Point。

如果(0 == 0)TP = 0。

如果(0 == 0)expire = 0。

int ticket = OrderSend(Symbol(), OP_SELLSTOP, Lots, price, Slippage, SL, TP, EAComment, OrderId, expire, Red) 。

如果(ticket == -1)

{

Print("OrderSend()错误 - ", ErrorDescription(GetLastError()))。

}

}

空白的MaximumOrder()

{

如果(MaxOrdersAllowed> 0)

{

OrderCount()。

}

}

空白的OrderCount()

{

int count = 0;

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

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

{

如果(OrderSymbol() == Symbol()

如果(OrderMagicNumber() == OrderId)

如果(OrderType() == OP_BUY || OrderType() == OP_SELL)

{

count++;

}

}

否则

{

Print("OrderSend() error - ", ErrorDescription(GetLastError()))。

}

如果(count > MaxOrdersAllowed )

{

DeleteOldestOrder()。

}

}

空白的DeleteOldestOrder()

{

datetime lastTime = 0;

int lastTicket = -1; // 无开放。

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

if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

如果(OrderSymbol() == Symbol() && OrderMagicNumber() == OrderId && OrderOpenTime() < lastTime && OrderTicket() < lastTicket )

{

lastTime = OrderOpenTime();

lastTicket = OrderTicket();

如果(OrderType() == OP_BUY || OrderType() == OP_SELL )

{

{

OrderClose(OrderTicket(),OrderLots(), OrderClosePrice(),Slippage,Red)。

}

}

}

return(lastTicket)。

}

否则

Print("OrderSelect()错误 - ", ErrorDescription(GetLastError()))。

}

int deinit()

{

如果(false)ObjectsDeleteAll()。

}

 
sulaimoney:
Hello Mladen ,

谁能告诉我我做错了什么,我主要是用FX Gen写我的EA,用mq4编译器和在线论坛上的例子来编写代码。

空白的OpenNewTrade()

{ datetime lastTime = 0;

int lastTicket = -1; // None open.

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

if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

如果(OrderSymbol() == Symbol() && OrderMagicNumber() == OrderId && OrderOpenTime() >= lastTime && OrderTicket() > lastTicket )

{

lastTime = OrderOpenTime();

lastTicket = OrderTicket()。

如果(OrderType() == OP_BUY || OrderType() == OP_SELL

&& Ask - OrderOpenPrice() >= Grid*PipValue*Point

{

{

BuyOrder()。

}

}

如果(OrderType() == OP_BUY || OrderType() == OP_SELL

&& OrderOpenPrice() - Bid >= Grid*PipValue*Point

{

{

SellOrder();

}

}

}

return(lastTicket)。

}

否则

Print("OrderSelect()错误 - ", ErrorDescription(GetLastError()))。

}

你能看一下这段代码吗?我试图用日期时间和订单票据先删除最古老的订单,例如,如果打开的订单>2,就删除最古老的订单。

//-------------------------------------------------------------

// Etasoft Inc.外汇EA和脚本生成器4.1版EA

//-------------------------------------------------------------

// 关键词。MT4,外汇EA生成器,创建EA,专家顾问开发者

#property copyright "Copyright © 2011, Etasoft Inc.外汇EA生成器 v4.1"

#property link

#include

#include

//导出的变量

extern int OrderId = 1;

extern int Slippage = 2;

extern double Lots = 0.01;

extern int MaxOrdersAllowed = 2;//允许操作买入和操作卖出

extern int Grid = 10; // 与开仓订单的总距离(点数)。

Extern string EAComment = "564 testing";

// 本地变量

double PipValue=1; // 这个变量是用来支持5位数的经纪商的。

bool Terminated = false;

string LF = "\n"; // 在你需要换行的自定义或实用程序块中使用这个变量

int NDigits = 4; // 主要用于Flex类型块中的NormalizeDouble。

int ObjCount = 0; // 计算图表上创建的所有对象,允许创建具有唯一名称的对象

int current = 0;

int init()

{

NDigits = Digits;

if (false) ObjectsDeleteAll(); // 清除图表

Comment(""); // 清除图表

}

// 专家开始

int start()

{

如果(Bars < 10)

{

Comment("没有足够的条数")。

返回(0)。

}

如果(Terminated == true)

{

Comment("EA终止了。")。

返回(0)。

}

OnEveryTick1();

}

空白 OnEveryTick1()

{

如果(true == false && false)PipValue = 10。

如果(true && (NDigits == 3 || NDigits == 5))PipValue = 10。

IfOrderDoesNotExist2()。

IfOrderDoesNotExist4();

最大订单()。

}

空白 IfOrderDoesNotExist2()

{

bool exists = false;

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

如果(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)

{

如果(OrderType() == OP_BUYSTOP && OrderSymbol() == Symbol() && OrderMagicNumber() == 1)

{

存在 = 真。

}

}

否则

{

Print("OrderSelect()错误 - ", ErrorDescription(GetLastError()))。

}

如果(existence == false)

{

BuyPendingOrder()。

}

}

void IfOrderDoesNotExist4()

{

bool exists = false;

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

如果(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)

{

如果(OrderType() == OP_SELLSTOP && OrderSymbol() == Symbol() && OrderMagicNumber() == 1)

{

存在 = 真。

}

}

否则

{

Print("OrderSelect()错误 - ", ErrorDescription(GetLastError()))。

}

如果(existence == false)

{

SellPendingOrder()。

}

}

空白的BuyPendingOrder()

{

int expire = TimeCurrent() + 60 * 0;

double price = NormalizeDouble((Ask-((Ask-Bid)/2), NDigits) + Grid*PipValue*Point;

双重SL = 价格 - 0*PipValue*Point。

如果(0 == 0)SL = 0。

双重TP = 价格 + 0*PipValue*Point。

如果(0 == 0)TP = 0。

如果(0 == 0)expire = 0。

int ticket = OrderSend(Symbol(), OP_BUYSTOP, Lots, price, Slippage, SL, TP, EAComment, OrderId, expire, Blue) 。

如果(ticket == -1)

{

Print("OrderSend() error - ", ErrorDescription(GetLastError()))。

}

}

void SellPendingOrder()

{

int expire = TimeCurrent() + 60 * 0;

double price = NormalizeDouble((Bid+((Ask-Bid)/2)), NDigits) - Grid*PipValue*Point;

双重 SL = 价格 + 0*PipValue*Point。

如果(0 == 0)SL = 0。

双重TP = 价格 - 0*PipValue*Point。

如果(0 == 0)TP = 0。

如果(0 == 0)expire = 0。

int ticket = OrderSend(Symbol(), OP_SELLSTOP, Lots, price, Slippage, SL, TP, EAComment, OrderId, expire, Red) 。

如果(ticket == -1)

{

Print("OrderSend()错误 - ", ErrorDescription(GetLastError()))。

}

}

空白的MaximumOrder()

{

如果(MaxOrdersAllowed> 0)

{

OrderCount()。

}

}

空白的OrderCount()

{

int count = 0;

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

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

{

如果(OrderSymbol() == Symbol()

如果(OrderMagicNumber() == OrderId)

如果(OrderType() == OP_BUY || OrderType() == OP_SELL)

{

count++;

}

}

否则

{

Print("OrderSend() error - ", ErrorDescription(GetLastError()))。

}

如果(count > MaxOrdersAllowed )

{

DeleteOldestOrder()。

}

}

空白的DeleteOldestOrder()

{

datetime lastTime = 0;

int lastTicket = -1; // 无开放。

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

if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

如果(OrderSymbol() == Symbol() && OrderMagicNumber() == OrderId && OrderOpenTime() < lastTime && OrderTicket() < lastTicket )

{

lastTime = OrderOpenTime();

lastTicket = OrderTicket();

如果(OrderType() == OP_BUY || OrderType() == OP_SELL )

{

{

OrderClose(OrderTicket(),OrderLots(), OrderClosePrice(),Slippage,Red)。

}

}

}

return(lastTicket)。

}

否则

Print("OrderSelect()错误 - ", ErrorDescription(GetLastError()))。

}

int deinit()

{

如果(false)ObjectsDeleteAll()。

}

尝试使用这样的函数

void DeleteOldestOrder()

{

datetime lastTime = Time[0]+Period()*60;

int lastTicket = -1; // None open.

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

{

if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;

if ((OrderType() == OP_BUY || OrderType() == OP_SELL) && OrderSymbol() == Symbol() && OrderMagicNumber() == OrderId && OrderOpenTime() <= lastTime)

{

lastTime = OrderOpenTime();

lastTicket = OrderTicket();

}

}

if (lastTicket>-1)

if (OrderSelect(lastTicket,SELECT_BY_TICKET,MODE_TRADES))

OrderClose(OrderTicket(),OrderLots(), OrderClosePrice(),Slippage,Red);

}
 

谢谢Mladen

它工作得完美无缺,另外,我为在论坛上发布这么长的代码感到抱歉。我还在适应这个界面。谢谢你。

 

指标不能自动刷新。

我有一个非常适合我交易的指标。

不幸的是,他不能自动更新。我必须总是手动刷新他,使其更新。

有什么办法解决这个问题吗?

这将是非常有帮助的!!

谢谢。

P.S.: 附上我的所有资料。

附加的文件:
 

他想收到短信通知。代码是怎样的?

 
popej30:
他想发送通知短信。这段代码看起来如何?

popej30

像这样做。

SendNotification("你想发送的通知信息")。

 

你在哪里插入你的电话号码?我的号码是0039 555-23-45。在哪里输入?

例子。

#property indicator_separate_window

#property indicator_minimum -1.1

#property indicator_maximum 1.1

#property indicator_buffers 2

#property indicator_color1 Aqua

#property indicator_color2 Lime

extern int period = 25;

extern int limit = 5000;

double g_ibuf_84[];

double g_ibuf_88[];

double g_ibuf_92[];

int init() {

IndicatorBuffers(3);

SetIndexStyle(0, DRAW_ARROW);

SetIndexStyle(1, DRAW_ARROW);

SetIndexStyle(2, DRAW_NONE);

SetIndexEmptyValue(0, 0.0);

SetIndexEmptyValue(1, 0.0);

SetIndexArrow(0, 233);

SetIndexArrow(1, 234);

SetIndexBuffer(0, g_ibuf_88);

SetIndexBuffer(1, g_ibuf_92);

SetIndexBuffer(2, g_ibuf_84);

IndicatorShortName("BR16");

return (0);

}

int start() {

double ld_72;

double ld_24 = 0;

double ld_32 = 0;

double ld_unused_40 = 0;

double ld_unused_48 = 0;

double ld_56 = 0;

double ld_unused_64 = 0;

double l_low_80 = 0;

double l_high_88 = 0;

for (int li_96 = 0; li_96 <= limit; li_96++) {

g_ibuf_88[li_96] = 0;

g_ibuf_92[li_96] = 0;

}

for (li_96 = 0; li_96 <= limit; li_96++) {

l_high_88 = High;

l_low_80 = Low;

ld_72 = (High[li_96] + Low[li_96]) / 2.0;

if (l_high_88 != l_low_80) ld_24 = 0.66 * ((ld_72 - l_low_80) / (l_high_88 - l_low_80) - 0.5) + 0.67 * ld_32;

else ld_24 = 0.0;

ld_24 = MathMin(MathMax(ld_24, -0.999), 0.999);

g_ibuf_84[li_96] = MathLog((ld_24 + 1.0) / (1 - ld_24)) / 2.0 + ld_56 / 2.0;

ld_32 = ld_24;

ld_56 = g_ibuf_84[li_96];

}

for (li_96 = 0; li_96 <= limit; li_96++) {

if (g_ibuf_84[li_96] >= 0.0 && g_ibuf_84[li_96 + 1] < 0.0) g_ibuf_88[li_96] = -1;

if (g_ibuf_84[li_96] 0.0) g_ibuf_92[li_96] = 1;

}

return (0);

}
 
popej30:
你在哪里插入你的电话号码?我的号码0039 555-23-45。在哪里输入?

例如。

#property indicator_separate_window

#property indicator_minimum -1.1

#property indicator_maximum 1.1

#property indicator_buffers 2

#property indicator_color1 Aqua

#property indicator_color2 Lime

extern int period = 25;

extern int limit = 5000;

double g_ibuf_84[];

double g_ibuf_88[];

double g_ibuf_92[];

int init() {

IndicatorBuffers(3);

SetIndexStyle(0, DRAW_ARROW);

SetIndexStyle(1, DRAW_ARROW);

SetIndexStyle(2, DRAW_NONE);

SetIndexEmptyValue(0, 0.0);

SetIndexEmptyValue(1, 0.0);

SetIndexArrow(0, 233);

SetIndexArrow(1, 234);

SetIndexBuffer(0, g_ibuf_88);

SetIndexBuffer(1, g_ibuf_92);

SetIndexBuffer(2, g_ibuf_84);

IndicatorShortName("BR16");

return (0);

}

int start() {

double ld_72;

double ld_24 = 0;

double ld_32 = 0;

double ld_unused_40 = 0;

double ld_unused_48 = 0;

double ld_56 = 0;

double ld_unused_64 = 0;

double l_low_80 = 0;

double l_high_88 = 0;

for (int li_96 = 0; li_96 <= limit; li_96++) {

g_ibuf_88[li_96] = 0;

g_ibuf_92[li_96] = 0;

}

for (li_96 = 0; li_96 <= limit; li_96++) {

l_high_88 = High;

l_low_80 = Low;

ld_72 = (High[li_96] + Low[li_96]) / 2.0;

if (l_high_88 != l_low_80) ld_24 = 0.66 * ((ld_72 - l_low_80) / (l_high_88 - l_low_80) - 0.5) + 0.67 * ld_32;

else ld_24 = 0.0;

ld_24 = MathMin(MathMax(ld_24, -0.999), 0.999);

g_ibuf_84[li_96] = MathLog((ld_24 + 1.0) / (1 - ld_24)) / 2.0 + ld_56 / 2.0;

ld_32 = ld_24;

ld_56 = g_ibuf_84[li_96];

}

for (li_96 = 0; li_96 <= limit; li_96++) {

if (g_ibuf_84[li_96] >= 0.0 && g_ibuf_84[li_96 + 1] < 0.0) g_ibuf_88[li_96] = -1;

if (g_ibuf_84[li_96] 0.0) g_ibuf_92[li_96] = 1;

}

return (0);

}

这里有一个很好的解释,你怎么能做到这一点。

 
Jim Clark:
指标不会自动刷新。

在这里,我有一个很适合我交易的指标。

不幸的是,他不会自己更新。我必须总是手动刷新他的更新。

有什么办法解决这个问题吗?

这将是非常有帮助的!!

谢谢。

P.S.: 附上我的所有资料。

吉姆

与其重写整个事情,不如添加一个限制来计算条形,然后所有这些条形被重新计算。这应该可以解决刷新的问题(只要把BarsTocalculate保持在某个合理的位置--不要太大,也不要太小。我使用了1000作为默认值,这样做似乎是可以的)。试试吧

附加的文件: