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

 
abeiks:

你好!

如何确定一个头寸是否在TP上被关闭?我认为OrderClosePrice()==OrderTakeProfit()的使用 是不正确的。

在订单注释中寻找[tp],如果有...

 
AlexeyVik:

在顺序评论中寻找[tp],如果有的话...


谢谢你。
 

你好,Profi。

帮助修复指标中的错误.....

指示器正在工作。

该信号在第0条上被触发。

但是,当在当前条形图上收到其他刻度时,它会再次触发并给出新的信号。

我需要它在卖出或买入事件发生时,把这个信号放在当前事件价格的位置上的一个圆圈里,并且在这个开放的酒吧里没有其他事件被处理。

我想避免在这个酒吧出现新的信号和圆圈。

________________________

我明白你会说这是无稽之谈,是虚假信号,等等,但这正是我所需要的。

我知道我应该创建一个旗帜,一个标记,等等 - 但我没有时间自己研究语言。

_________________________

如果你能在所附文件中添加这样的标志,并在添加的行中 标注颜色.....,我将非常感激。

谢谢你,我希望有人会回应

附加的文件:
 
alvlaf:

犯了几个错误,不能正确对待。这里有什么问题吗?

//+------------------------------------------------------------------+
//| BB1.mq4 |
//| Copyright 2016, MetaQuotes Software Corp.
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp.
#属性链接 "https://www.mql5.com"
#财产版本 "1.00"
#属性严格

外置双数Lots = 1; // Lots
extern int Exp = 1; // 过期时间
外部int Wait = 2; // 一个方向的烛台数量
Extern int Timeout = 1; // Time slot
外置双倍数Multiplier = 3; // 倍增器
外部int Slippage = 5; // Slippage
外置 int Magic = 774274; // Magic
extern int MaxOpenOrders = 1; // 最大订单数

int ticket, Type, SymbolCount;
双倍价格,地段。

输入字符串 TradeSymbols = "EURUSD_OP, GBPUSD_OP, AUDUSD_OP, NZDUSD_OP, USDCAD_OP, USDCHF_OP, GBPCAD_OP, AUDNZD_OP, CHFJPY_OP, GBPCHF_OP"; // 交易的符号

string Symbols[50]; // 50是最大可能的符号数。


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

int OnInit()

{

如果(IsTesting() || !ExtractSymbols())

{

SymbolCount = 1;

Symbols[0] = Symbol()。

}

return(INIT_SUCCEEDED)。

}

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

bool ExtractSymbols()

{

ushort Comma = StringGetCharacter(",", 0);

SymbolCount = StringSplit(TradeSymbols, Comma, Symbols);

for (int i = 0; i < SymbolCount; i++)

{

StringToUpper(Symbols[i])。

符号[i] = StringTrimRight(Symbols[i]); //防止意外的空格。

Symbols[i] = StringTrimLeft(Symbols[i]);

}

如果(SymbolCount > 0)返回(true)。

return(false)。

}

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

空白的OnTick()

{

for (int i=0; i<SymbolCount; i++)

{

如果(CountTrades() == 0) // 订单的数量必须为零

{

如果(((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) < PriceOpenLastHistOrder(OP_BUY) ) ||

(TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) > PriceOpenLastHistOrder(OP_SELL) )&& MaxOpenOrders > OrdersTotal())

// 如果最后一笔交易是亏损的,同样的交易将被打开,但手数更多。

{

类型=TypeLastHistOrder()。

如果(Type == OP_BUY) Price = LastAsk;

如果(类型==OP_SELL)价格=LastBid。

Lot = NormalizeDouble(LotsLastHistOrder()*Multiplier, 2);

ticket = OrderSend(Symbols[i], Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic)。

}

如果(PriceCloseLastHistOrder() == PriceOpenLastHistOrder() && CountHistTrades() > 0 && MaxOpenOrders > OrdersTotal()

// 如果最后一笔交易的利润等于零,则将开出相同的交易

{

类型=TypeLastHistOrder()。

如果(Type == OP_BUY) Price = LastAsk;

如果(类型==OP_SELL)价格=LastBid。

Lot = NormalizeDouble(LotsLastHistOrder(), 2);

ticket = OrderSend(Symbols[i], Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic)

}

如果((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) > PriceOpenLastHistOrder(OP_BUY))

|| (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) < PriceOpenLastHistOrder(OP_SELL) )

|| CountHistTrades() == 0)//如果最后一笔交易是盈利的,则打开订单

{

如果(SignalBuy(Symbols[i])&& MaxOpenOrders > OrdersTotal())

{

ticket = OrderSend(Symbols[i], OP_BUY, Lots, Ask, Slippage, 0, 0, IntegerToString(Exp), Magic)

}

如果(SignalSell(Symbols[i])&& MaxOpenOrders > OrdersTotal())

{

ticket = OrderSend(Symbols[i], OP_SELL, Lots, Bid, Slippage, 0, 0, IntegerToString(Exp), Magic)

}

}

}

}

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

int CountTrades(int type = -1)

{

int cnt = 0。

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

{

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

{

如果(OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

cnt++。

}

}

return(cnt)。

}

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

int CountHistTrades(int type = -1)

{

int cnt = 0。

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

{

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

{

如果(OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

cnt++。

}

}

return(cnt)。

}

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

bool SignalBuy(string Sym)

{

for (int i=1; i<=Wait; i++)

{

double C = iClose(Sym, PERIOD_M5, i); // 在此指定所需的时间框架。

double O = iOpen(Sym, PERIOD_M5, i);

如果(C>O)返回(false)。

}

如果((iBarShift(Sym, 0, TimeLastHistOrder()+Timeout) >= Wait || (Wait == 0 && TimeCurrent() >= TimeLastHistOrder()+Timeout) )

&& CountHistTrades() > 0) return(true)。

如果(CountHistTrades() ==0)返回(true)。

return(false)。

}

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

bool SignalSell(string Sym)

{

for (int i=1; i<=Wait; i++)

{

double C = iClose(Sym, PERIOD_M5, i); // 在此指定所需的时间框架。

double O = iOpen(Sym, PERIOD_M5, i);

如果(C < O)返回(false)。

}

如果((iBarShift(Sym, 0, TimeLastHistOrder()+Timeout) >= Wait || (Wait == 0 && TimeCurrent() >= TimeLastHistOrder()+Timeout) )

&& CountHistTrades() > 0) return(true)。

如果(CountHistTrades() ==0)返回(true)。

return(false)。

}

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

datetime TimeLastHistOrder(int type = -1)

{

datetime lasttime = 0;

datetime opentime = 0;

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

{

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

{

如果(OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

{

如果(OrderCloseTime() > lasttime)

{

lasttime = OrderCloseTime();

opentime = OrderOpenTime()。

}

}

}

}

return(opentime)。

}

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

int TypeLastHistOrder()

{

datetime time = 0;

int type = -1;

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

{

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

{

如果(OrderMagicNumber() == Magic)

{

如果(OrderCloseTime() > time)

{

time = OrderCloseTime()。

type = OrderType()。

}

}

}

}

return(type)。

}

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

double LotsLastHistOrder(int type = -1)

{

datetime time = 0;

double lots = 0;

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

{

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

{

如果(OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

{

如果(OrderOpenTime() > time)

{

time = OrderOpenTime()。

时间 = OrderLots()。

}

}

}

}

return(lot)。

}

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

double PriceCloseLastHistOrder(int type = -1)

{

datetime time = 0;

双倍价格=0。

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

{

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

{

如果(OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

{

如果(OrderCloseTime() > time)

{

time = OrderCloseTime()。

price = OrderClosePrice()。

}

}

}

}

return(price)。

}

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

double PriceOpenLastHistOrder(int type = -1)

{

datetime time = 0;

双倍价格=0。

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

{

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

{

如果(OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

{

如果(OrderCloseTime() > time)

{

time = OrderCloseTime()。

price = OrderOpenPrice()。

}

}

}

}

return(price)。

}

除了打开两个不同的符号外,它还设法为一个相同的符号同时打开几个位置。在某个地方,你和我都有点过火了。
 

请帮助我根据新闻进行交易。我需要一个有两个主要功能的EA。

第一个功能:在给定的时间,在给定的价格水平,用给定的TP和SL下挂单
第二个功能:保持挂单与价格平行。这意味着将它们与价格一起移动(手动操作太麻烦了)。在特定的时间,在新闻发布的时刻,我们必须停止这一行动,并等到价格触及其中一个订单。此后,第二份订单立即被删除。

再一次。
在新闻发布前2分钟,在距离价格10个点的地方放上两个相反的止损单,立即启动与价格平行移动的功能,2分钟内与价格一起移动,一个订单远离价格,第二个追上价格。在新闻发布时,你应该禁用挂单移动的功能,然后等待其中一个订单的崩溃。第二个订单在第一个订单崩溃后立即被删除。

在EA的属性中改变的可变变量(大约是我想象的那样,我不知道现实中的实现情况)。

TP - 600(默认)。

Trall - 300 (默认)

SL - 100(默认)。

点数 - 100(默认情况下与价格的距离)。

滑点 - 100(滑点默认为点)。

地段 - 0.1

风险 - 10 //百分比(好吧,这不是必要的,如果有必要,我以后会问的)。

TimeNews1On - true(使用下面的单元格输入时间,false - 顾问不进行交易。)

TimeNewsHour - 小时(新闻发布时间1)。

TimeNewsMin - 分钟(新闻发布时间1)。

TimeNews2On - false(默认)。

TimeNewsHour - 小时(新闻发布时间2)

TimeNewsMin - 分钟(新闻发布时间2)。

时间新闻3月1日 - 假的

TimeNewsHour - 小时(新闻发布时间3)

TimeNewsMin - 分钟(新闻发布时间3)。

时代新闻网 - 假的

TimeNewsHour - 小时(新闻发布时间4)

TimeNewsMin - 分钟(新闻发布时间4)。

时间新闻5On - false

TimeNewsHour - 小时(新闻发布时间5)

TimeNewsMin - 分钟(新闻发布时间5)。


Insta,五位数。


我正在手动做这一切,这太麻烦了,现在我没有时间去琢磨新闻,我想在早上或晚上把专家顾问放在当天会有新闻的货币对上,这样他们都会有结果。
--------------------------------------

如果你知道这样的专家,请分享。

提前感谢您!

 
alvlaf:

让我们回到你的源代码。像这样试试吧。

int OnInit()

{

if (!GlobalVariableCheck("AllowNewOrders")) GlobalVariableSet("AllowNewOrders",1);

return(INIT_SUCCEED)。

}

空白的OnDeInit()。

{

GlobalVariableSet("AllowNewOrders",1)

}

空白的OnTick()

{

如果(CountTrades() == 0) // 订单的数量必须为零

{

如果((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) < PriceOpenLastHistOrder(OP_BUY) )

|| (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) > PriceOpenLastHistOrder(OP_SELL))

// 如果最后一笔交易是亏损的,则开出相同的交易,但手数更大。

{

GlobalVariableSet("AllowNewOrders", 0)。

类型=TypeLastHistOrder()。

如果(Type == OP_BUY) Price = Ask;

如果(类型== OP_SELL)价格=Bid。

Lot = NormalizeDouble(LotsLastHistOrder()*Multiplier, 2);

ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);

}

如果(PriceCloseLastHistOrder() == PriceOpenLastHistOrder() && CountHistTrades() > 0)。

// 如果上一次交易的利润 等于零,则将开出相同的交易。

{

GlobalVariableSet("AllowNewOrders", 0)。

类型=TypeLastHistOrder()。

如果(Type == OP_BUY) Price = Ask;

如果(类型== OP_SELL)价格=Bid。

Lot = NormalizeDouble(LotsLastHistOrder(), 2);

ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);

}

如果((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) > PriceOpenLastHistOrder(OP_BUY))

|| (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) < PriceOpenLastHistOrder(OP_SELL) )

|| CountHistTrades() == 0)//如果最后一笔交易是盈利的,订单就会被打开。

{

如果(GlobalVariableGet("AllowNewOrders")>0)返回。

如果(SignalBuy() && MaxOpenOrders > OrdersTotal())

{

ticket = OrderSend(Symbol(, OP_BUY, Lots, Ask, Slippage, 0, 0, IntegerToString(Exp), Magic)。

如果(ticket>0)GlobalVariableSet("AllowNewOrders", 0)。

}

如果(SignalSell() && MaxOpenOrders > OrdersTotal())

{

ticket = OrderSend(Symbol(, OP_SELL, Lots, Bid, Slippage, 0, 0, IntegerToString(Exp), Magic)。

如果(ticket>0)GlobalVariableSet("AllowNewOrders", 0)。

}

}

}

}

我没有检查过,因为我不明白一个总限价为1个订单的EA的多个副本如何决定在哪个符号上(在一个盈利系列之后)开始交易比较好?

 
BooGUY:


请帮助根据消息进行交易。真的需要一个EA,它应该有两个主要功能。

第一个功能:在给定的时间,在距离价格给定的水平,用给定的TP和SL下挂单
第二个功能:保持挂单与价格平行。这意味着将它们与价格一起移动(手动操作太麻烦了)。在特定的时间,在新闻发布的时刻,我们必须停止这一行动,并等到价格触及其中一个订单。此后,第二份订单立即被删除。

再一次。
在新闻发布前2分钟,在距离价格10个点的地方放上两个相反的止损单,立即启动与价格平行移动的功能,2分钟内与价格一起移动,一个订单远离价格,第二个追上价格。在新闻发布时,你应该禁用挂单移动的功能,然后等待其中一个订单的崩溃。第二个将在第一个崩溃后立即被删除。

如果你知道或遇到过这样的顾问,请分享一下


提前感谢您!

我可以把从文件中读取新闻的代码发给你,它可能会派上用场。每周一次,你看经济日历并把你应该注意的新闻的数据输入文件夹_with_terminal\MQL4\Files\novosti.txt,顾问甚至可以在新闻之前激活(你可以用这个顾问来跟踪美国会议的开始,例如--在有强烈运动的情况下)。我还没有完成交易代码,因为我被新闻严重 "欺骗 "了几次:))最新版本在不同的距离放置了6个订单(3个买入止损点+3个卖出止损点),有不同的止盈。总之,我的新闻代码可以使用,但我必须改进我的交易代码。

#属性严格

输入字符串 NewsFilename = "novosti.txt"; // 包含新闻的文本文件的名称。

输入 int MinutesBefore = 5; // 应该在新闻发布前多少分钟下单。

输入 int MinutesAfter1 = 15; // 新闻发布后多少分钟,删除第一组的订单

输入 int MinutesAfter2 = 30; // 在新闻发布后多少分钟删除第二组订单

输入 int MinutesAfter3 = 30; // 新闻发布后多少分钟内删除第3组订单

输入 int PriceIndent1 = 15; // 从价格中缩进的点数

输入 int PriceIndent2 = 5; // 从上一个TakeProfit开始往后退,单位是点。

输入 int TakeProfit1 = 40; // 第一组的TakeProfit大小,单位为点。

输入 int TakeProfit2 = 60; // 第二组的TakeProfit大小,单位为点。

输入 int TakeProfit3 = 100; // 第三组的TakeProfit大小,单位为点。

输入 int StopLoss = 20; // 所有订单的StopLoss大小,单位为点。

输入双倍数Multiplier1 = 1.0; // 对第二组的订单批次的系数

输入双倍数Multiplier2 = 2.0; // 对第三组的订单手数的系数。

输入 int MaximalRisk = 10; // 最大的风险,以百分数表示。

//====================================================================================================

datetime Times[200]; // LastTime;

string Symbols[200];

bool NewsPassed[200]。

int NewsCount。

//====================================================================================================

int OnInit()

{

// 加载新鲜的新闻

if (!LoadNews()) return(INIT_FAILED);

return(INIT_SUCCEEDED)。

}

//====================================================================================================

空白的OnTick()

{

if (!IsTradeAllowed()) return;

datetime TestTime = iTime(Symbol(), PERIOD_H1, 0)。

// 在每天开始时更新新闻

如果(TimeDay(TestTime) != TimeDay(LastTime))

{

LastTime = TestTime。

if (!LoadNews())

{

Alert("更新新闻错误!")。

返回。

}

}

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

for (int i = 0; i < NewsCount; i++)

{

// Till新闻发布把订单作为突破口

如果(Times[i] > TimeCurrent() && Times[i] - TimeCurrent() <= MinutesBefore * 60 && !NewsPassed[i])

{

PrintFormat("当前时间是%s,是时候设置货币订单了 - %s", TimeToStr(TimeCurrent(), TIME_DATE|TIME_MINUTES), Symbols[i])。

SetupOrders(Symbols[i];

NewsPassed[i] = true。

}

}

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

}

//====================================================================================================

bool LoadNews()

{

int Count, Tick = 0;

string Str, Data[40];

ResetLastError()。

如果(!FileIsExist(NewsFilename, 0))

{

PrintFormat("The news file %s does not exist.", NewsFilename)。

Print("该文件必须在文件夹\\MQL4\Files中,在测试的情况下-在文件夹\Tester\Files中。")。

return(false)。

}

int Handle = FileOpen(NewsFilename, FILE_READ|FILE_SHARE_READ|FILE_TXT) 。

如果(Handle != INVALID_HANDLE)

{

while (!FileIsEnding(Handle))

{

Str = FileReadString(Handle)。

Count = StringSplit(Str, StringGetChar(" ", 0), Data);

for (int i = 1; i < Count; i = i + 2)

{

Times[Tick] = StringToTime(Data[0] + " + Data[i])。

符号[Tick] = 数据[i + 1]。

Tick++;

}

}

FileClose(Handle)。

NewsCount = Tick;

for (int i = 0; i < NewsCount; i++)

{

如果(Times[i] > TimeCurrent())NewsPassed[i] = false。

否则NewsPassed[i] = false。

}

PrintFormat("Number of news uploaded - %i.", NewsCount);

return(true)。

}

PrintFormat("Can't open file %s.错误代码%d。", NewsFilename, GetLastError())。

return(false)。

}

//====================================================================================================

空白的SetupOrders(string Sym)。

{

int Ticket, Dig, Count;

双重价格,TP,SL,地段。

datetime KeepAlive = TimeCurrent() + (MinutesBefore + MinutesAfter1) * 60;

string SymList[7];

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

如果(Sym == "AUD")

{

SymList[0] = "AUDCAD"; SymList[1] = "AUDCHF"; SymList[2] = "AUDJPY"; SymList[3] = "AUDNZD";

SymList[4] = "AUDUSD"; SymList[5] = "EURAUD"; SymList[6] = "GBPAUD"。

}

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

如果(Sym == "CAD")

{

SymList[0] = "AUDCAD"; SymList[1] = "CADCHF"; SymList[2] = "CADJPY"; SymList[3] = "EURCAD";

SymList[4] = "GBPCAD"; SymList[5] = "NZDCAD"; SymList[6] = "USDCAD";

}

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

如果(Sym == "CHF")

{

SymList[0] = "AUDCHF"; SymList[1] = "CADCHF"; SymList[2] = "EURCHF"; SymList[3] = "GBPCHF"。

SymList[4] = "CHFJPY"; SymList[5] = "NZDCHF"; SymList[6] = "USDCHF"。

}

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

如果(Sym == "EUR")

{

SymList[0] = "EURAUD"; SymList[1] = "EURCAD"; SymList[2] = "EURCHF"; SymList[3] = "EURGBP"。

SymList[4] = "EURJPY"; SymList[5] = "EURNZD"; SymList[6] = "EURUSD"。

}

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

如果(Sym == "GBP")

{

SymList[0] = "EURGBP"; SymList[1] = "GBPAUD"; SymList[2] = "GBPCAD"; SymList[3] = "GBPCHF"。

SymList[4] = "GBPJPY"; SymList[5] = "GBPNZD"; SymList[6] = "GBPUSD"。

}

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

如果(Sym == "JPY")

{

SymList[0] = "AUDJPY"; SymList[1] = "CADJPY"; SymList[2] = "CHFJPY"; SymList[3] = "EURJPY"。

SymList[4] = "GBPJPY"; SymList[5] = "NZDJPY"; SymList[6] = "USDJPY"。

}

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

如果(Sym == "NZD")

{

SymList[0] = "AUDNZD"; SymList[1] = "EURNZD"; SymList[2] = "GBPNZD"; SymList[3] = "NZDCAD";

SymList[4] = "NZDCHF"; SymList[5] = "NZDJPY"; SymList[6] = "NZDUSD";

}

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

如果(Sym == "USD")

{

SymList[0] = "AUSUSD"; SymList[1] = "EURUSD"; SymList[2] = "GBPUSD"; SymList[3] = "NZDUSD"。

SymList[4] = "USDCAD"; SymList[5] = "USDCHF"; SymList[6] = "USDJPY"。

}

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

for (int i = 0; i < 7; i++)

{

计数=0。

Dig = int(MarketInfo(SymList[i], MODE_DIGITS))。

Lot = NormalizeDouble(0.01, 2);

//购买

KeepAlive = TimeCurrent() + (MinutesBefore + MinutesAfter1) * 60;

Price = NormalizeDouble(MarketInfo(SymList[i], MODE_ASK) + PriceIndent1 / pow(10, Dig-1), Dig);

TP = NormalizeDouble(Price + TakeProfit1 / pow(10, Dig-1), Dig)。

SL = NormalizeDouble(Price - StopLoss / pow(10, Dig-1), Dig);

Ticket = OrderSend(SymList[i], OP_BUYSTOP, Lot, Price, 5, SL, TP, NULL, 0, KeepAlive, clrLimeGreen)。

if (Ticket > 0) Count++; else PrintFormat("Error creating order %i, symbol %s, price %f, Take %f, Stop %f, Lot %f.", GetLastError(), SymList[i], Price, TP, SL, Lot)。

KeepAlive = TimeCurrent() + (MinutesBefore + MinutesAfter2) * 60;

价格=NormalizeDouble(TP + PriceIndent2 / pow(10, Dig-1), Dig)。

TP = NormalizeDouble(Price + TakeProfit2 / pow(10, Dig-1), Dig)。

SL = NormalizeDouble(Price - StopLoss / pow(10, Dig-1), Dig);

Ticket = OrderSend(SymList[i], OP_BUYSTOP, Lot * Multiplier1, Price, 5, SL, TP, NULL, 0, KeepAlive, clrLimeGreen)。

if (Ticket > 0) Count++; else PrintFormat("Error creating order %i, symbol %s, price %f, Take %f, Stop %f, Lot %f.", GetLastError(), SymList[i], Price, TP, SL, Lot*Multiplier1)

KeepAlive = TimeCurrent() + (MinutesBefore + MinutesAfter3) * 60;

价格=NormalizeDouble(TP + PriceIndent2 / pow(10, Dig-1), Dig)。

TP = NormalizeDouble(Price + TakeProfit2 / pow(10, Dig-1), Dig)。

SL = NormalizeDouble(Price - StopLoss / pow(10, Dig-1), Dig);

Ticket = OrderSend(SymList[i], OP_BUYSTOP, Lot*Multiplier2, Price, 5, SL, TP, NULL, 0, KeepAlive, clrLimeGreen)。

if (Ticket > 0) Count++; else PrintFormat("Error creating order %i, symbol %s, price %f, take %f, stop %f, lot %f.", GetLastError(), SymList[i], Price, TP, SL, Lot*Multiplier2)

// 销售

KeepAlive = TimeCurrent() + (MinutesBefore + MinutesAfter1) * 60;

Price = NormalizeDouble(MarketInfo(SymList[i], MODE_BID) - PriceIndent1 / pow(10, Dig-1), Dig);

TP = NormalizeDouble(Price - TakeProfit1 / pow(10, Dig-1), Dig)。

SL = NormalizeDouble(Price + StopLoss / pow(10, Dig-1), Dig);

Ticket = OrderSend(SymList[i], OP_SELLSTOP, Lot, Price, 5, SL, TP, NULL, 0, KeepAlive, clrOrangeRed)。

if (Ticket > 0) Count++; else PrintFormat("Error creating order %i, symbol %s, price %f, Take %f, Stop %f, Lot %f.", GetLastError(), SymList[i], Price, TP, SL, Lot)。

KeepAlive = TimeCurrent() + (MinutesBefore + MinutesAfter2) * 60;

价格=NormalizeDouble(TP - PriceIndent2 / pow(10, Dig-1), Dig)。

TP = NormalizeDouble(Price - TakeProfit2 / pow(10, Dig-1), Dig)。

SL = NormalizeDouble(Price + StopLoss / pow(10, Dig-1), Dig);

Ticket = OrderSend(SymList[i], OP_SELLSTOP, Lot, Price, 5, SL, TP, NULL, 0, KeepAlive, clrOrangeRed)。

if (Ticket > 0) Count++; else PrintFormat("Error creating order %i, symbol %s, price %f, Take %f, Stop %f, Lot %f.", GetLastError(), SymList[i], Price, TP, SL, Lot*Multiplier1)

KeepAlive = TimeCurrent() + (MinutesBefore + MinutesAfter3) * 60;

价格=NormalizeDouble(TP - PriceIndent2 / pow(10, Dig-1), Dig)。

TP = NormalizeDouble(Price - TakeProfit3 / pow(10, Dig-1), Dig)。

SL = NormalizeDouble(Price + StopLoss / pow(10, Dig-1), Dig);

Ticket = OrderSend(SymList[i], OP_SELLSTOP, Lot, Price, 5, SL, TP, NULL, 0, KeepAlive, clrOrangeRed)。

PrintFormat("有%i个由符号%s下的订单", SymList[i], Count);0 }

}

新闻文件看起来像这样。

15.09.2016 01:45 NZD 04:30 AUD 10:30 CHF 14:00 GBP 15:30 USD

16.09.2016 15:30 USD 17:00 USD

等等...

 
A13ksandr:

让我们回到你的源代码。像这样试试吧。

int OnInit()

{

if (!GlobalVariableCheck("AllowNewOrders")) GlobalVariableSet("AllowNewOrders",1);

return(INIT_SUCCEED)。

}

空白的OnDeInit()。

{

GlobalVariableSet("AllowNewOrders",1)

}

空白的OnTick()

{

如果(CountTrades() == 0) // 订单的数量必须为零

{

如果((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) < PriceOpenLastHistOrder(OP_BUY) )

|| (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) > PriceOpenLastHistOrder(OP_SELL))

// 如果最后一笔交易是亏损的,则开出相同的交易,但手数更大。

{

GlobalVariableSet("AllowNewOrders", 0)。

类型=TypeLastHistOrder()。

如果(Type == OP_BUY) Price = Ask;

如果(类型== OP_SELL)价格=Bid。

Lot = NormalizeDouble(LotsLastHistOrder()*Multiplier, 2);

ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);

}

如果(PriceCloseLastHistOrder() == PriceOpenLastHistOrder() && CountHistTrades() > 0)。

// 如果上一次交易的利润等于零,则将开出相同的交易。

{

GlobalVariableSet("AllowNewOrders", 0)。

类型=TypeLastHistOrder()。

如果(Type == OP_BUY) Price = Ask;

如果(类型== OP_SELL)价格=Bid。

Lot = NormalizeDouble(LotsLastHistOrder(), 2);

ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);

}

如果((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) > PriceOpenLastHistOrder(OP_BUY))

|| (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) < PriceOpenLastHistOrder(OP_SELL) )

|| CountHistTrades() == 0)//如果最后一笔交易是盈利的,订单就会被打开。

{

如果(GlobalVariableGet("AllowNewOrders")>0)返回。

如果(SignalBuy() && MaxOpenOrders > OrdersTotal())

{

ticket = OrderSend(Symbol(, OP_BUY, Lots, Ask, Slippage, 0, 0, IntegerToString(Exp), Magic)。

如果(ticket>0)GlobalVariableSet("AllowNewOrders", 0)。

}

如果(SignalSell() && MaxOpenOrders > OrdersTotal())

{

ticket = OrderSend(Symbol(, OP_SELL, Lots, Bid, Slippage, 0, 0, IntegerToString(Exp), Magic)。

如果(ticket>0)GlobalVariableSet("AllowNewOrders", 0)。

}

}

}

}

我没有检查过,因为我不明白一个总限价为1个订单的EA的几个副本如何检测哪个符号(在一个盈利系列之后)开始交易比较好?

亚历山大,机器人必须等待每个符号在一个方向上的指定数量的蜡烛,然后开始一个系列,也就是说,在哪个符号这个条件首先被触发,为该符号打开第一笔交易。同时,你应该禁止为其他符号打开一个系列,直到第一个系列完成盈利。

你给出的最后一个代码是一个进步--它根本没有打开任何交易(即,禁令是有效的)。我完全不明白为什么没有。所附的是日志的截图。

 

也许现在是时候学习如何插入代码 了!

int OnInit()

{

   if (!GlobalVariableCheck("AllowNewOrders")) GlobalVariableSet("AllowNewOrders",1);

   return(INIT_SUCCEEDED);

}

void  OnDeInit()

{

   GlobalVariableSet("AllowNewOrders",1); 

} 

void OnTick()

{

   if (CountTrades() == 0) // Количество ордеров должно равняться нулю

   {

      if ((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) < PriceOpenLastHistOrder(OP_BUY))

      || (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) > PriceOpenLastHistOrder(OP_SELL)))

      // Если последняя сделка убыточная, то открывается такая же, но с увеличенным лотом

      {

         GlobalVariableSet("AllowNewOrders", 0);

         Type = TypeLastHistOrder();

         if (Type == OP_BUY)  Price = Ask;

         if (Type == OP_SELL) Price = Bid;

         Lot = NormalizeDouble(LotsLastHistOrder()*Multiplier, 2);

         ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);

      }

      if (PriceCloseLastHistOrder() == PriceOpenLastHistOrder() && CountHistTrades() > 0) 

      // Если прибыль последней сделки равняется нулю, то открывается такая же

      {

         GlobalVariableSet("AllowNewOrders", 0);

         Type = TypeLastHistOrder();

         if (Type == OP_BUY)  Price = Ask;

         if (Type == OP_SELL) Price = Bid;

         Lot = NormalizeDouble(LotsLastHistOrder(), 2);

         ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);

      }

      if (((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) > PriceOpenLastHistOrder(OP_BUY))

      || (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) < PriceOpenLastHistOrder(OP_SELL)))

      || CountHistTrades() == 0)// Если последняя сделка прибыльная, то открывается ордер

      {

         if (GlobalVariableGet("AllowNewOrders") > 0) return;

         if (SignalBuy() && MaxOpenOrders > OrdersTotal())

         {

            ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, IntegerToString(Exp), Magic);

            if (ticket>0) GlobalVariableSet("AllowNewOrders", 0);

         }

         if (SignalSell() && MaxOpenOrders > OrdersTotal())

         {

            ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, IntegerToString(Exp), Magic);

            if (ticket>0) GlobalVariableSet("AllowNewOrders", 0);

         }

      }

   }

} 
 
abeiks: 也许现在是时候学习如何插入代码了!
int OnInit()                     // ИХМО так нагляднее
{
   if (!GlobalVariableCheck("AllowNewOrders")) GlobalVariableSet("AllowNewOrders",1);
   return(INIT_SUCCEEDED);
}

void  OnDeInit()
{
   GlobalVariableSet("AllowNewOrders",1); 
} 

void OnTick()
{
   if (CountTrades() == 0) // Количество ордеров должно равняться нулю
   {
      if ((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) < PriceOpenLastHistOrder(OP_BUY))
      || (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) > PriceOpenLastHistOrder(OP_SELL)))
      // Если последняя сделка убыточная, то открывается такая же, но с увеличенным лотом
      {
         GlobalVariableSet("AllowNewOrders", 0);
         Type = TypeLastHistOrder();
         if (Type == OP_BUY)  Price = Ask;
         if (Type == OP_SELL) Price = Bid;
         Lot = NormalizeDouble(LotsLastHistOrder()*Multiplier, 2);
         ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);
      }

      if (PriceCloseLastHistOrder() == PriceOpenLastHistOrder() && CountHistTrades() > 0) 

      // Если прибыль последней сделки равняется нулю, то открывается такая же
      {
         GlobalVariableSet("AllowNewOrders", 0);
         Type = TypeLastHistOrder();
         if (Type == OP_BUY)  Price = Ask;
         if (Type == OP_SELL) Price = Bid;
         Lot = NormalizeDouble(LotsLastHistOrder(), 2);
         ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);
      }

      if (((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) > PriceOpenLastHistOrder(OP_BUY))
      || (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) < PriceOpenLastHistOrder(OP_SELL)))
      || CountHistTrades() == 0)// Если последняя сделка прибыльная, то открывается ордер
      {
         if (GlobalVariableGet("AllowNewOrders") > 0) return;
         if (SignalBuy() && MaxOpenOrders > OrdersTotal())
         {
            ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, IntegerToString(Exp), Magic);
            if (ticket>0) GlobalVariableSet("AllowNewOrders", 0);
         }

         if (SignalSell() && MaxOpenOrders > OrdersTotal())
         {
            ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, IntegerToString(Exp), Magic);
            if (ticket>0) GlobalVariableSet("AllowNewOrders", 0);
         }
      }
   }
}