KimIV的有用功能 - 页 19

 

GetProfitOpenPosInCurrency()函数。

该函数返回当前所开仓位的总利润。利润以存款货币为单位返回。使用外部参数指定要考虑的位置的更精确选择。

  • sy- 市场工具的名称。如果你指定这个参数,函数将只考虑这个乐器的位置。默认值"" 意味着任何市场工具。NULL 表示当前的仪器。
  • op- 贸易操作,职位类型。有效值:OP_BUYOP_SELL-1。默认值-1 意味着任何位置。
  • mn- 位置标识符,MagicNumber。默认值-1 表示任何标识符。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает суммарный профит открытых позиций в валюте депозита |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
double GetProfitOpenPosInCurrency(string sy="", int op=-1, int mn=-1) {
  double p=0;
  int    i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) {
            p+=OrderProfit()+OrderCommission()+OrderSwap();
          }
        }
      }
    }
  }
  return(p);
}
附上一个测试GetProfitOpenPosInCurrency()函数的脚本。
附加的文件:
 
KimIV:
scorpionk:

错误的代码,不是131,是130。

我明白了...

试着按以下方式进行正常化。

int dg=MarketInfo(Symbol(), MODE_DIGITS);
return(NormalizeDouble(Value, dg));
我这样做了,我没有遇到错误130。

这就是我带来的价格,只使用Digits。但这并没有帮助,错误并不总是弹出,只是在某些情况下,而且我还没有发现它取决于什么。我也许应该用我的手来检查试图由机器人设置的输出值。

 

考虑到未来可能的发展,这一补充将派上用场。

p+=OrderProfit()+OrderTaxes()+OrderCommission()+OrderSwap();
// !!! OrdertTaxes() мифический парамер налогов !!!
我想知道是否会有五分之一的人...?;)))

再次感谢您 提供的关于如何 总结循环中的数据的提示

 

溜溜球,你在跟我开玩笑吗?我的编译器不理解OrderTaxes()。

 

当然了!!!。:)))

你可以在突出显示中看到它,在评论中明确指出...

虽然它是一个秩序的属性 之一,或者说是一个职位,而且这样的功能原则上应该是...

-

而如果编译器不理解...

GNI会教我们;)

 

GetProfitOpenPosInPoint()函数。

该函数返回当前所开仓位的总利润。利润以点数形式返回。要考虑的位置的更精确选择是由外部参数指定的。

  • sy- 市场工具的名称。如果你指定这个参数,函数将只考虑这个乐器的位置。默认值"" 意味着任何市场工具。NULL 表示当前的仪器。
  • op- 贸易操作,职位类型。有效值:OP_BUYOP_SELL-1。默认值-1 意味着任何位置。
  • mn- 位置标识符,MagicNumber。默认值-1 表示任何标识符。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает суммарный профит открытых позиций в пунктах         |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int GetProfitOpenPosInPoint(string sy="", int op=-1, int mn=-1) {
  double p;
  int    i, k=OrdersTotal(), pr=0;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (mn<0 || OrderMagicNumber()==mn) {
          p=MarketInfo(OrderSymbol(), MODE_POINT);
          if (p==0) if (StringFind(OrderSymbol(), "JPY")<0) p=0.0001; else p=0.01;
          if (OrderType()==OP_BUY) {
            pr+=(MarketInfo(OrderSymbol(), MODE_BID)-OrderOpenPrice())/p;
          }
          if (OrderType()==OP_SELL) {
            pr+=(OrderOpenPrice()-MarketInfo(OrderSymbol(), MODE_ASK))/p;
          }
        }
      }
    }
  }
  return(pr);
}
附上一个测试GetProfitOpenPosInPoint()函数的脚本。
附加的文件:
 
KimIV:

在这个主题中,我将发布我在MQL4中的函数代码,给出它们的使用实例,并回答与它们的使用有关的问题。每项功能将在两个帖子中公布。第一篇文章将包含功能代码,第二篇--使用实例和简短解释。有时我会在第二篇文章中附上脚本的代码,以实际测试功能并显示结果。

最后我将按照Lukyanov"如何同时运行两个EA"主题中的要求,从处理订单的功能开始。

首先是订单设置功能(MT4测试版)。

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия  : 13.06.2007                                                      |
//|  Описание : Установка ордера. Версия функции для тестов на истории.        |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    op - операция                                                           |
//|    ll - лот                                                                |
//|    pp - цена                                                               |
//|    sl - уровень стоп                                                       |
//|    tp - уровень тейк                                                       |
//|    mn - Magic Number                                                       |
//|    ex - Срок истечения                                                     |
//+----------------------------------------------------------------------------+
void SetOrder(string sy, int op, double ll, double pp,
              double sl=0, double tp=0, int mn=0, datetime ex=0) {
  color clOpen;
  int   err, ticket;
 
  if (sy=="" || sy=="0") sy=Symbol();
  if (op==OP_BUYLIMIT || op==OP_BUYSTOP) clOpen=clOpenBuy; else clOpen=clOpenSell;
  ticket=OrderSend(sy, op, ll, pp, Slippage, sl, tp, "", mn, ex, clOpen);
  if (ticket<0) {
    err=GetLastError();
    Print("Error(",err,") set ",GetNameOP(op),": ",ErrorDescription(err));
    Print("Ask=",Ask," Bid=",Bid," sy=",sy," ll=",ll,
          " pp=",pp," sl=",sl," tp=",tp," mn=",mn);
  }
}
//+----------------------------------------------------------------------------+

嗨,请帮我写一个EA。我对它了解不多,但听起来是个好主意。在下面的想法的意义,如果它肯定是可能的。
有必要同时开启两个竞价,一个卖出,一个买入,参数为(手数=0.1____TafeProfit=30______StopLoss=10),并在亏损结束后开启第二个正数,参数为(手数=1____TafeProfit=30______StopLoss=10)。
如果你不打算派我上呼......那么最好是在最低或最高烛光时或在新烛光出现时开出两个初始赌注,但如果第二部分写长了至少使我第一部分的漫谈

提前感谢!!!!如果你写了,放在这里 vms.80@mail.ru



 

GetTicketLastPos()函数。

该函数返回最后一次开仓的票据或-1。要考虑的位置的更精确选择是由外部参数指定的。

  • sy- 市场工具的名称。如果你指定这个参数,函数将只考虑这个乐器的位置。默认值"" 意味着任何市场工具。NULL 表示当前的仪器。
  • op- 贸易操作,职位类型。有效值:OP_BUYOP_SELL-1。默认值-1 意味着任何位置。
  • mn- 位置标识符,MagicNumber。默认值-1 表示任何标识符。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает тикет последней открытой позиции или -1             |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int GetTicketLastPos(string sy="", int op=-1, int mn=-1) {
  datetime o;
  int      i, k=OrdersTotal(), r=-1;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (o<OrderOpenTime()) {
                o=OrderOpenTime();
                r=OrderTicket();
              }
            }
          }
        }
      }
    }
  }
  return(r);
}
HH. 附上测试GetTicketLastPos()函数的脚本。
附加的文件:
 
WoodyVMS:

我不知道该怎么做,但我有一个想法,那就是怎么做。我对此不了解,但这可能是一个好主意。其要点如下,如果可能的话。
有必要同时打开两个出价,一个卖出,一个买入,参数为(手数=0.1____TafeProfit=30______StopLoss=10),当关闭亏损时,打开第二个正面,参数为(手数=1____TafeProfit=30______StopLoss=10)。
如果你不打算派我上呼......那么最好是在低位或高位蜡烛图或新蜡烛图出现时开出两个初始赌注,但如果第二部分写得太长的话,至少要把我的第一部分漫谈内容写出来

提前感谢!!!!如果你写了,放在这里 vms.80@mail.ru

或者给该同志发送所有的CodeBase EAs到这个地址。

对不起,伊戈尔,我离题了。如果有的话,我将删除它。

 
Vinin писал (а):
或者给该同志发送所有的CodeBase EAs到这个地址。
他自己会找到的...