KimIV的有用功能 - 页 49

 
KimIV писал (а)>>

如何使用ExistOrders()函数的例子。

5.检查任何设置时间为2小时或更早的订单

ExistOrders("", -1, -1, TimeCurrent()-2*60*60);

晚上好,我对这个评论有点困惑。我正坐在这里想办法呢 !我不知道如何正确表述我的条件--"不早于5分钟 "或 "不晚于5分钟" !(在我开始思考之前,我就已经很清楚了!)

我需要删除一个挂单,如果它在一定时间内没有触发。例如,在设置!后的5分钟内。

我已经这么做了。

if (ExistOrders(NULL, OP_BUYSTOP, Magic,TimeCurrent()-5*60) >0) //ЕСЛИ ЕСТЬ ОРДЕР BUYSTOP > 5 min 
                 DeleteOrders(NULL, OP_BUYSTOP, Magic);
if (ExistOrders(NULL, OP_SELLSTOP, Magic,TimeCurrent()-5*60) >0) //ЕСЛИ ЕСТЬ ОРДЕР SELLSTOP > 5 min  
                 DeleteOrders(NULL, OP_SELLSTOP, Magic);

这是否正确?但它在测试器中不起作用。下单后立即删除。

请教如何正确编写ExistOrders()函数

 
rid писал (а)>>
我有点糊涂了...

我似乎也很困惑。让我们一起来...:-)

ot 参数(下单时间)已被引入ExistOrders 函数,以正确处理错误128、142和143。错误处理的目的是排除同一顺序的双重(在实际情况下,甚至是三重)设置。为了做到这一点,发送交易指令的时间被记住 了,交易尝试被暂停。暂停后,检查是否有设定时间的订单在记忆的订单 之后。如果有订单,就会得出结论,认为已经达到了目标(订单已被设定),交易尝试就会终止。换句话说,检查订单设置后的时间被传递给ot 参数。后来=不早了

写了(a)>>
我需要删除一个挂单,如果它在一定时间内没有触发。例如,在设置!的5分钟内。

ExistOrders 函数的ot 参数在这里没有帮助。它在相反的方向上工作。它的工作方向是更接近于现在。你需要做的是向过去迈进。OrderSend 函数的过期 参数(或SetOrder 函数的ex 参数)在这方面非常好。

 

测试员的ClosePosBySelect()函数。

执行一个预选位置的关闭。这是之前在第13页 发布的同名功能的轻量级版本。没有多余的东西。没有额外的功能。在我的实践中,我从来没有遇到过在测试器中没有关闭的位置。这就是为什么这个函数中没有检查。它们在测试器中是不必要的。

//+----------------------------------------------------------------------------+
//|  Автор   : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                    |
//+----------------------------------------------------------------------------+
//|  Версия  : 13.06.2007                                                      |
//|  Описание: Закрытие одной предварительно выбранной позиции                 |
//+----------------------------------------------------------------------------+
void ClosePosBySelect() {
  double pp;

  if (OrderType()==OP_BUY) {
    pp=MarketInfo(OrderSymbol(), MODE_BID);
    OrderClose(OrderTicket(), OrderLots(), pp, Slippage, clCloseBuy);
  }
  if (OrderType()==OP_SELL) {
    pp=MarketInfo(OrderSymbol(), MODE_ASK);
    OrderClose(OrderTicket(), OrderLots(), pp, Slippage, clCloseSell);
  }
}

SZY.函数ClosePosBySelect()的使用实例,我将在后面给出,与函数OpenPosition()一起用于测试者。

 

大家好。为了避免每次都要翻阅页面,我不得不把内容按分支做出来。

我在这里和那里整合了类似主题的功能。内容从1页到40页。

那些愿意的人可以继续并增加其他页面,并把它们放在这里。

附加的文件:
 

你好,伊戈尔,我需要你的帮助。我已经决定在e-CloseByProfit EA中实现与e-CloseByPercentProfit类似的平仓功能。

一切工作正常,专家顾问工作正常,终端关闭。但当我重新打开终端时,它马上就关闭了。

请帮助我修改代码以纠正这个问题。

//+----------------------------------------------------------------------------+
//| e-CloseByProfit.mq4|
//| Kim Igor V. aka KimIV !
//|http://www.kimiv.ru|
//| |
//| 22.10.2006 专家顾问在指定的时间内关闭所有头寸。
//|利润水平。
//| 20.06.2008 修正了积分利润计算中的错误。
//+----------------------------------------------------------------------------+
#财产版权 "Kim Igor V. aka KimIV"
#属性链接"http://www.kimiv.ru"
#define MAGIC 20061022

//------- 专家顾问的外部参数 ------------------------------------------
Extern string _P_Expert = "---------- EA parameters";
extern bool CurSymbolOnly = false; // 只有当前的符号。
外部intProfit = 100; // TakeProfit
外部 bool CloseTerminal = False; // 关闭终端
外部 bool ShowComment = True; // 显示评论
extern int NumberAccount = 0; // 交易账户的数量
外部 bool UseSound = True; // 使用声音信号
Extern string NameFileSound = "manycoin.wav"; // 声音文件的名称
外部int Slippage = 3; // 价格滑点
extern inttern NumberOfTry = 5; // 尝试的数量

//------- 专家顾问的全局变量 --------------------------------------
color clCloseBuy = Blue; // color clCloseSell = Red; // color of buy close symbol
color clCloseSell = Red; // Sell close flag的颜色。
int CurProfit;

//------- 外部模块的连接 -------------------------------------------
#include <stdlib.mqh>.
#include <WinUser32.mqh>.

//+----------------------------------------------------------------------------+
//|专家初始化功能|
//+----------------------------------------------------------------------------+
void init() { if (!IsTesting())Comment(""); }

//+----------------------------------------------------------------------------+
//|专家去初始化功能|
//+----------------------------------------------------------------------------+
void deinit() { if (!IsTesting())Comment("); }

//+----------------------------------------------------------------------------+
//|专家启动功能|
//+----------------------------------------------------------------------------+
空白启动() {
如果(!IsTesting()){
如果(NumberAccount>0 && NumberAccount!=AccountNumber()){
Message("禁止在该账户中交易" +AccountNumber())。
返回。
} else Comment(")。
}

CloseByProfit()。
如果(ShowComment){
评论(IIFs(CurSymbolOnly, "CurSymbolOnly ", ")。
"当前利润=",CurProfit," p."
"收盘利润=",TakeProfit," p."
);
}
}


//+----------------------------------------------------------------------------+
//| Author : Kim Igor V. aka KimIV,http://www.kimiv.ru|。
//+----------------------------------------------------------------------------+
//| 版本号 : 19.02.2008||
//| 说明:关闭一个预先选定的位置|。
//+----------------------------------------------------------------------------+
空白的ClosePosBySelect() {
bool fc;
关闭。
双层,pa,pb,pp。
int err, it;

如果(OrderType()==OP_BUY || OrderType()==OP_SELL) {
for (it=1; it<=NumberOfTry; it++) {
if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
while (!IsTradeAllowed())睡眠(5000)。
RefreshRates()。
pa=MarketInfo(OrderSymbol(), MODE_ASK)。
pb=MarketInfo(OrderSymbol(), MODE_BID)。
如果(OrderType()==OP_BUY){
pp=pb; clClose=closeBuy。
} else {
pp=pa; clClose=closeSell。
}
ll=OrderLots()。
fc=OrderClose(OrderTicket(), ll, pp, Slippage, clClose)。
如果(fc) {
如果(UseSound)PlaySound(NameFileSound); break;
} else {
err=GetLastError()。
如果(err==146) while (IsTradeContextBusy())睡眠(1000*11)。
Print("Error(",err,") Close ",GetNameOP(OrderType())," "。
ErrorDescription(err),", try ",it)。
Print(OrderTicket()," Ask=",pa," Bid=",pb," pp=",pp);
Print("sy=",OrderSymbol()," ll=",ll," sl=" ,OrderStopLoss()。
" tp=",OrderTakeProfit()," mn=",OrderMagicNumber())。
睡眠(1000*5)。
}
}
} else Print("无效的交易操作。关闭",GetNameOP(OrderType())。
}

//+----------------------------------------------------------------------------+
//| Author : Kim Igor V. aka KimIV,http://www.kimiv.ru|。
//+----------------------------------------------------------------------------+
//| 版本号 : 19.02.2008||
//| 说明:以市场价格平仓首先获利。
//+----------------------------------------------------------------------------+
//| 参数: |
//| sy - 仪器的名称(" - 任何符号,|)
//| NULL - 当前符号) |
|//| op - 操作 (-1 - 任何位置) |
//| mn - 魔法数字(-1 - 任何魔法)|
//+----------------------------------------------------------------------------+
void ClosePosFirstProfit(string sy="", int op=-1, int mn=-1) {
int i, k=OrdersTotal();
如果(sy=="0")sy=符号()。

// 首先关闭盈利的头寸
for (i=k-1; i>=0; i--) {
如果(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
如果((OrderSymbol()==sy || sy==")&& (op<0 || OrderType()==op)){
如果(OrderType()==OP_BUY || OrderType()==OP_SELL) {
如果(mn<0 || OrderMagicNumber()==mn) {
如果(OrderProfit()+OrderSwap()>0)ClosePosBySelect()。
}
}
}
}
}
// 然后是其他所有的
k=OrdersTotal()。
for (i=k-1; i>=0; i--) {
如果(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
如果((OrderSymbol()==sy || sy==")&& (op<0 || OrderType()==op)){
如果(OrderType()==OP_BUY || OrderType()==OP_SELL) {
如果(mn<0 || OrderMagicNumber()==mn) ClosePosBySelect()。
}
}
}
}
}

//+----------------------------------------------------------------------------+
//|获利后关闭所有头寸。
//+----------------------------------------------------------------------------+
空白的 CloseByProfit() {
双帕,Pb,pp。
int i, k=OrdersTotal(), pr=0;

for (i=0; i<k; i++) {
如果(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
如果(!CurSymbolOnly || OrderSymbol()==Symbol()){
pa=MarketInfo(OrderSymbol(), MODE_ASK)。
pb=MarketInfo(OrderSymbol(), MODE_BID)。
pp=MarketInfo(OrderSymbol(), MODE_POINT)。
如果(pp=0)如果(StringFind(OrderSymbol(), "JPY")<0) pp=0.0001; 否则pp=0.01。
如果(OrderType()==OP_BUY){
pr+=NormalizeDouble((pb-OrderOpenPrice())/pp, 0)。
}
如果(OrderType()==OP_SELL) {
pr+=NormalizeDouble((OrderOpenPrice()-pa)/pp, 0);
}
}
}
}
CurProfit=pr;
如果(CurProfit>=TakeProfit) ClosePosFirstProfit()。
如果(CloseTerminal && !ExistPositions())CloseTerminal()。
}
//+----------------------------------------------------------------------------+
//|关闭交易终端。
//+----------------------------------------------------------------------------+
关闭终端() {
Print("CloseTerminal()已触发;)
int hwnd=WindowHandle(Symbol(), Period())。
int hwnd_parent=0。

while(!IsStopped()){
hwnd=GetParent(hwnd)。
如果(hwnd==0)打破。
hwnd_parent=hwnd。
}
if (hwnd_parent!=0) PostMessageA(hwnd_parent, WM_CLOSE, 0, 0);
}

//+----------------------------------------------------------------------------+
//|返回存在的标志。
//| 参数: |
//| sy - 仪器的名称(" - 任何符号,|)
//| NULL - 当前符号) |
|//| op - 操作 (-1 - 任何位置) |
//| mn - 魔法数字(-1 - 任何魔法)|
//+----------------------------------------------------------------------------+
bool ExistPositions(string sy="", int op=-1, int mn=-1) {
int i, k=OrdersTotal();

如果(StringLen(sy)==1 && StringGetChar(sy, 0)==48) sy=Symbol();
for (i=0; i<k; i++) {
如果(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
如果(OrderSymbol()==sy || sy=="){
如果(OrderType()==OP_BUY || OrderType()==OP_SELL) {
如果(op<0 || OrderType()==op){
如果(mn<0 || OrderMagicNumber()==mn)返回(True)。
}
}
}
}
}
return(False)。
}
//+----------------------------------------------------------------------------+
//| Author : Kim Igor V. aka KimIV,http://www.kimiv.ru|。
//+----------------------------------------------------------------------------+
//| 版本号 : 01.09.2005||
//| 描述 : 返回贸易操作的名称。
//+----------------------------------------------------------------------------+
//| 参数: ||
//| op--贸易操作的标识符。
//+----------------------------------------------------------------------------+
string GetNameOP(int op) {
switch (op) {
case OP_BUY : return("Buy");
case OP_SELL : return("Sell");
case OP_BUYLIMIT : return("BuyLimit");
case OP_SELLLIMIT : return("SellLimit");
case OP_BUYSTOP : return("BuyStop");
case OP_SELLSTOP : return("SellStop");
默认:返回("未知操作")。
}
}

//+----------------------------------------------------------------------------+
//| Author : Kim Igor V. aka KimIV,http://www.kimiv.ru|。
//+----------------------------------------------------------------------------+
//| 版本号 : 01.02.2008||
//| 说明:根据条件,它返回两个值中的一个。
//+----------------------------------------------------------------------------+
string IIFs(bool condition, string ifTrue, string ifFalse) {
如果(条件)返回(ifTrue);否则返回(ifFalse)。
}

//+----------------------------------------------------------------------------+
//| 输出信息到评论和日志
//+----------------------------------------------------------------------------+
空白消息(字符串m) {
评论(m)。
如果(StringLen(m)>0) Print(m)。
}
//+----------------------------------------------------------------------------+

 
Vkorch писал (а)>>
你好,伊戈尔,我需要你的帮助。我决定在e-CloseByProfit EA中编写与e-CloseByPercentProfit类似的终端平仓功能。

一切工作正常,EA工作,终端关闭。但当我重新打开终端时,专家顾问立即关闭了它。
帮助修改代码,以消除这一缺陷。

要像这样做。

CurProfit=pr;
if (CurProfit>=TakeProfit) {
  ClosePosFirstProfit();
  if (CloseTerminal && !ExistPositions()) CloseTerminal();
}
 
KimIV писал(а)>>

要像这样做。

谢谢你,伊戈尔。修正了它。但是在编译的时候,我有一个错误

'(' - 函数定义出乎意料 C:\Program Files\MetaTrader - Alpari\experts-CloseByProfit.mq4 (180, 19)

我应该怎么做?

 

Igor,你能不能制作一个,用于处理订单和仓位的函数库?这个库已经开发和测试了2年多,我附上了文件,也许有些想法会派上用场。

至于

OpenPosition("GBPJPY", OP_SELL, 0.1, pb+23*po, pb-44*po);

也许调用OpenPosition("GBPJPY",OP_SELL, 0.1, 23, 44)会更好。

а

double pa=MarketInfo("USDCAD", MODE_ASK);
double pb=MarketInfo("USDCAD", MODE_BID);
double po=MarketInfo(
"USDCAD", MODE_POINT);
and this insert 
  
 
double lot_min =MarketInfo(Symbol(), MODE_MINLOT)
; 
if(Lots<lot_min) return;

在函数内计算,即把sl 值传给 tp,并在函数内正确计算和归一化一切。


	          
附加的文件:
 

你好,伊戈尔!

如果我有一个0.3手的仓位,我需要。

1.关闭部分0.1手仓位。

修改(将止损移至另一水平)。

2.1更多平仓部分0.1手。

修改(将止损设置为另一个水平)。

3.关闭位置。

还有一个问题?当部分位置被关闭时。

OrderClose(OrderTicket(),NormalizeDouble(OrderLots()/3,2),Ask,3,Violet) 。

我得到错误131(错误的音量)。

请为一个新手解答。可以用文字。

.

 
Prival писал (а)>>
伊戈尔,是否有可能使函数,作为一个库来处理订单和仓位。

不,这不是...原则上,它已经安排好了,因为它应该是......我不贴出来是因为这个库的所有功能还没有公布...自从这个话题开始以来,还剩下一两个或三个人出现。

我将仔细考虑其余的问题......

原因: