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

 
//+------------------------------------------------------------------+
//| 删除和/或关闭一个订单,按数量过滤。
//---------------------------------------------------------------------
#property show_inputs
//--------------------------------------------------------------------
外部双倍MinLot = 0.01; //将被删除/关闭的最小手数
extern double MaxLot = 0.1; //被删除/绕过的最大手数
外部 bool Buy = false; //删除/关闭买入订单的方向。
外部 bool Sell = false; //删除/关闭卖出订单的方向。
外部 bool pending = true; //删除未决订单
外部 bool market = true; //关闭市场头寸
extern int slippage = 2; //关闭市场头寸时的价格浮动幅度
//--------------------------------------------------------------------
int start()
{
双重SL,TP。
string txt=StringConcatenate("Script remove or close order, start",TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS);
RefreshRates()。

bool error=true。
int Error,OT,Ticket,nn;
双层OOP,OL。
while(true)
{
for (int j = OrdersTotal()-1; j >= 0; j--)
{
如果(OrderSelect(j, SELECT_BY_POS))
{
如果((OrderSymbol() == Symbol()
{
OL = OrderLots()。
如果(OL<MinLot || OL>MaxLot)继续。
OT = OrderType()。
如果(!市场&&OT<2)继续。
if (!pending && OT>1) 继续。
Ticket = OrderTicket()。
OOP = OrderOpenPrice()。
如果(OT==OP_BUY)
{
error=OrderClose(Ticket,OrderLots(),NormalizeDouble(Bid,Digits),slipage,Red);
如果(错误)txt = StringConcatenate(txt,"\nClosed BUY Order",Ticket)。
else txt = StringConcatenate(txt,"\nClosing error",GetLastError())。
}
如果(OT==OP_SELL)
{
error=OrderClose(Ticket,OrderLots(),NormalizeDouble(Ask,Digits),slipage,Blue)。
如果(错误) txt = StringConcatenate(txt, "卖出订单关闭",Ticket;)
else txt = StringConcatenate(txt,"\nError",GetLastError()," close",Ticket)。
}
如果(OT>1)
{
error=OrderDelete(Ticket);
如果(错误)txt = StringConcatenate(txt,"\nOrderDeleted",StrOrdersType(OT)," ",Ticket)。
else txt = StringConcatenate(txt,"\nError",GetLastError()," removal",StrOrdersType(OT)," " Ticket)。
}
if (!error)
{
Error = GetLastError()。
如果(Error<2)继续。
如果(Error==129)
{ Comment("Incorrect price",TimeToStr(TimeCurrent(),TIME_SECONDS))。
睡眠(5000)。
RefreshRates()。
继续。
}
如果(Error==146)
{
j++;
如果(IsTradeContextBusy())睡眠(2000)。
继续。
}
Comment("Error",Error," closing order N",OrderTicket(),
",TimeToStr(TimeCurrent(),TIME_SECONDS))。
}
}
}
}
int n=0。
for (j = 0; j < OrdersTotal(); j++)
{
如果(OrderSelect(j, SELECT_BY_POS))
{
如果(OrderSymbol() == Symbol()
{
OL = OrderLots()。
如果(OL<MinLot || OL>MaxLot)继续。
OT = OrderType()。
如果(!市场&&OT<2)继续。
if (!pending && OT>1) 继续。
n++;
}
}
}
如果(n==0)打破。
nn++。
如果(nn>10){Comment("未能关闭所有交易,仍有",n);break;}。
睡眠(1000)。
RefreshRates()。
}
Comment(txt, "nScript已经完成了它的工作",TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS))。
return(0);
}
//--------------------------------------------------------------------
string StrOrdersType(int t)
{
如果(t==OP_BUY)返回("买入")。
如果(t==OP_SELL)返回("卖出")。
如果(t==OP_BUYLIMIT)返回("BuyLimit")。
如果(t==OP_SELLLIMIT)返回("SellLimit")。
如果(t==OP_BUYSTOP)返回("BuyStop")。
如果(t==OP_SELLSTOP)返回("SellStop")。
}

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

我应该在脚本中添加或修改什么,以按手数关闭所有货币对的所有未结订单。

 
维特克,使用SRC 按钮来插入代码!谁需要去翻阅无法阅读的涂鸦?
 
pu6ka:
是的,询问价格是不可见的,但它们是:)
在可视化工具中,你可以按下暂停键,在图表属性中选择 "显示询问线 "并继续测试。MT4中的价格图通常是按Bid绘制的。

测试的质量取决于什么,如何才能将其提高到最大程度?
 
Zver4991:

以及测试的质量取决于什么,如何才能将其提高到最大程度?
老实说,我不知道。我还不需要,在网站上查一查。
 

亲爱的专业人士。
你能告诉我如何在不使用周期的情况下打开挂单 的网格吗?
如果不难,请至少展示一个这样的代码的粗略例子,
,能够改变每一个后续订单的网格的步长和手数。

 
Forexman77:
我把线

而不是int Ticket;错误就出来了。

'=' - 左侧方括号,预计为数组('=' - 左侧方括号,预计为数组)

'>' - 左方小括号,预计为数组 ('=' - 左方括号,预计为数组)

'>' - 意外的令牌('>' - 意外的令牌)

')'- 预期分配('' - 预期分配)

'continue' - 'break' 或 'continue' 仅在某些循环内使用 )

以及更多。


因此,Ticket仍然在旧版本中的某个地方被使用。我们需要对代码进行清理...
 
1mql:

亲爱的专业人士。
你能告诉我如何在不使用循环的情况下打开一个挂单的网格吗?
如果不难,请至少展示一个这样的代码的粗略例子。
如果你能改变网格中每个后续订单的步骤和手数。

是的,实际上,它和在一个循环中是一样的......但没有循环。向我们展示你是如何在循环中打开的,并解释你为什么不想使用循环,因为不清楚你想达到什么目的
 
borilunad:
维特克,使用SRC 按钮来粘贴代码!谁需要翻阅无法阅读的涂鸦呢!?

//+------------------------------------------------------------------+
//| удаления и/или закрытие ордера, с фильтрацией его по объему |
//---------------------------------------------------------------------
#property show_inputs
//--------------------------------------------------------------------
extern double MinLot = 0.01; //минимальный лот который удаляем/закываем
extern double MaxLot = 0.1; //максимальный лот который удаляем/закываем
extern bool Buy = false; //удалять/закрывать направление buy ордеров
extern bool Sell = false; //удалять/закрывать направление sell ордеров
extern bool pending = true; //удалить отложенные ордера
extern bool market = true ; //закрыть рыночные позиции
extern int slippage = 2; //проскальзывание цены при закрытии рыночных позиций
//--------------------------------------------------------------------
int start()
{
double SL,TP;
string txt=StringConcatenate("Скрипт удаления или закрытие ордера, старт ",TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS));
RefreshRates();

bool error=true;
int Error,OT,Ticket,nn;
double OOP,OL;
while(true)
{
for (int j = OrdersTotal()-1; j >= 0; j--)
{
if (OrderSelect(j, SELECT_BY_POS))
{
if ((OrderSymbol() == Symbol()))
{
OL = OrderLots();
if (OL<MinLot || OL>MaxLot) continue;
OT = OrderType();
if (!market && OT<2) continue;
if (!pending && OT>1) continue;
Ticket = OrderTicket();
OOP = OrderOpenPrice();
if (OT==OP_BUY)
{
error=OrderClose(Ticket,OrderLots(),NormalizeDouble(Bid,Digits),slippage,Red);
if (error) txt = StringConcatenate(txt,"\nЗакрыт ордер BUY ",Ticket);
else txt = StringConcatenate(txt,"\nОшибка закрытия ",GetLastError());
}
if (OT==OP_SELL)
{
error=OrderClose(Ticket,OrderLots(),NormalizeDouble(Ask,Digits),slippage,Blue);
if (error) txt = StringConcatenate(txt,"\nЗакрыт ордер SELL ",Ticket);
else txt = StringConcatenate(txt,"\nОшибка ",GetLastError()," закрытия ",Ticket);
}
if (OT>1)
{
error=OrderDelete(Ticket);
if (error) txt = StringConcatenate(txt,"\nУдален ордер ",StrOrdersType(OT)," ",Ticket);
else txt = StringConcatenate(txt,"\nОшибка ",GetLastError()," удаления ",StrOrdersType(OT)," ",Ticket);
}
if (!error)
{
Error = GetLastError();
if (Error<2) continue;
if (Error==129)
{ Comment("Неправильная цена ",TimeToStr(TimeCurrent(),TIME_SECONDS));
Sleep(5000);
RefreshRates();
continue;
}
if (Error==146)
{
j++;
if (IsTradeContextBusy()) Sleep(2000);
continue;
}
Comment("Ошибка ",Error," закрытия ордера N ",OrderTicket(),
" ",TimeToStr(TimeCurrent(),TIME_SECONDS));
}
}
}
}
int n=0;
for (j = 0; j < OrdersTotal(); j++)
{
if (OrderSelect(j, SELECT_BY_POS))
{
if (OrderSymbol() == Symbol())
{
OL = OrderLots();
if (OL<MinLot || OL>MaxLot) continue;
OT = OrderType();
if (!market && OT<2) continue;
if (!pending && OT>1) continue;
n++;
}
}
}
if (n==0) break;
nn++;
if (nn>10) {Comment("Не удалось закрыть все сделки, осталось еще ",n);break;}
Sleep(1000);
RefreshRates();
}
Comment(txt,"\nСкрипт закончил свою работу ",TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS));
return(0);
}
//--------------------------------------------------------------------
string StrOrdersType(int t)
{
if (t==OP_BUY) return("Buy");
if (t==OP_SELL) return("Sell");
if (t==OP_BUYLIMIT) return("BuyLimit");
if (t==OP_SELLLIMIT) return("SellLimit");
if (t==OP_BUYSTOP) return("BuyStop");
if (t==OP_SELLSTOP) return("SellStop");
}
//--------------------------------------------------------------------

我应该增加或改变什么,以按手数关闭所有货币对的所有未结订单。

 
Vitek2010:

我应该增加或改变什么,以按手数关闭所有货币对的所有未结订单。

在最后一个extern下面。
extern int slippage = 2; // 关闭市场头寸时的价格滑点

再插入一个。
extern bool total_symb = true; //在所有对上

并在每条线上。
如果(OrderSymbol() ==Symbol()
и
如果(OrderSymbol() ==Symbol())

用这个来代替。
如果(OrderSymbol() ==Symbol() || total_symb)

理论上应该可以,请检查。

 
问题出现了,是否有可能写一个专家顾问 或脚本,这将是为了实现例如2%的损失在当天将关闭所有交易?
原因: