KimIV的有用功能 - 页 92

 
alexpert007 >> :

这里还有一个问题要问伊戈尔。

你是否创建了一个单独的自定义(或其他)函数来翻转买入-卖出头寸,反之亦然,而不使用通常的OrderClose-OrderSend?

我不是伊戈尔,但有一个标准的OrderCloseBy 函数用于翻转。

 

你好,我需要帮助来解决一个问题。让我试着描述一下:

,有一个计算订单的函数。

int OrdersAll(int mag)
{
int kolvo=0;
for (int i=OrdersTotal()-1; i>=0; i-)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if((OrderType()==OP_BUY || OrderType()==OP_SELL) && OrderSymbol()==Symbol() && OrderMagicNumber() == mag )
kolvo++;
}
}
return(kolvo);
}

此外,在这个过程中,如果当前符号没有订单,当条件得到满足时,应该下1个订单,例如,买入。

if(OrdersAll(MAGICNO)==0)
{
if(condition)
{
op=Ask;if(SL>0){sl=Ask-SL*Point*mn;}if(TP>0){tp=Ask+TP*Point*mn;}
err=OrderSend(Symbol(),OP_BUY,LotsOptimized(),NormalizeDouble(op,Digits),3,NormalizeDouble(sl,Digits),
NormalizeDouble(tp,Digits),"" MAGICNO,0,Blue);
if(err<0)
{
Print("OrderSend() - Error OP_BUY。该订单不被接受。op "+op+" sl "+sl+" tp "+tp+""+GetLastError());返回(-1);
}
}
}

相反,当在终端中打开几个符号并在每个符号中运行EA时,例如,上面的代码可以打开一个订单 - 这是正确的,但同时它可以打开20-30个订单,直到海象耗尽,如果条件保持了几个点。我还没有看到这种情况发生在一件乐器上,但我也不能完全肯定它不会发生在一件乐器上。我如何修复我的代码,使其难以打开不超过一个订单。

 

伊戈尔,晚上好。

我无法管理你的函数调用。

//+----------------------------------------------------------------------------+
//| Author : Kim Igor V. aka KimIV,http://www.kimiv.ru|。
//+----------------------------------------------------------------------------+
//| 版本号 : 19.02.2008||
//| 说明:返回以存款货币计算的未结头寸的总利润。
//+----------------------------------------------------------------------------+
//| 参数: |
//| sy - 仪器的名称 (" - 任何符号, |)
//| NULL - 当前符号) |
|//| op - 操作 (-1 - 任何位置) |
//| mn - 魔法数字(-1 - 任何魔法)|
//+----------------------------------------------------------------------------+
double GetProfitOpenPosInCurrency(string sy="", int op=-1, int mn=-1) {
double p=0。
int i, k=OrdersTotal();

如果(sy=="0")sy=符号()。
for (i=0; i<k; 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) {
p+=OrderProfit()+OrderCommission()+OrderSwap()。
}
}
}
}
}
return(p)。
}

你能告诉我,在调用TotOrdProf=GetProfitOpenBuyPosInCurrency(EURUSD, ____, 1)。

1.假设欧元兑美元,是否应该用引号 "EURUSD",还是可以不用引号。

2.第二个调用参数应该是什么(其中有一个破折号)来计算买入和卖出的总利润(我试过默认的-1;不正确)。

3.第三个参数是专家顾问的神奇数字?- 我还没有接触到它,只是问一下我对参数的理解是否正确。

谢谢。

 

TotOrdProf=GetProfitOpenBuyPosInCurrency("EURUSD",-1, -1)。

- 仅适用于欧元兑美元

- 所有空缺职位(-1)

- 有任何魔法的位置(-1)

 

下午好。

如你所知,Sleep() 在终端测试器中不起作用,所以你必须使用数学函数的循环来延迟执行。

if (IsTesting()==true){for(int z0 = 1; z0 < zFILE*10000; z0++){MathSqrt(MathPow(5,5));MathSqrt(MathPow(5,5));MathSqrt(MathPow(5,5));}}

其中zFILE是专家顾问的执行延迟。

我的问题是:是否有更复杂的解决方案,因为我需要一些从几秒钟到10-20分钟的延迟(由外部程序处理数据)?

或者至少如何更准确地测量运行时间(因为处理器的性能是不同的),并选择最慢的那个?





 
Piboli >> :

问题:是否有一个更优雅的解决方案(延迟功能),因为需要从几秒钟到10-20分钟的延迟(由外部软件处理数据)?

没有尝试使用回调和同步器吗?

 

金的职能

我想知道是否有一个功能可以让你拉出最后一个图案的名称

并记录其组成部分的变化


 

KimIV 也许你可以和写一个指标

该指标应在指定的时间内搜索一个平坦的通道,并且不比设置中指定的宽。

这个指标应该在一天内和过渡到第二天的情况下搜索通道,正如你的函数isTradeTimeInt()。
这个指标可以在一天内绘制5个通道,也可以只绘制一个。
在设置中

外部双倍的最大通道高度,单位是点
extern int Bar_Time 我们如何计算以条为单位的时间间隔(1)或以小时和分钟为单位的时间间隔(2)。
extern string 通道的最小时间间隔,单位是小时和分钟
外部int int 通道的最小时间间隔,单位是条。
外来的int 最大的绘制通道数,保持绘制。

我把一个类似的指标附在 https://www.mql5.com/ru/code,但它在严格设定的时间间隔内画出通道,而不是自己去寻找这样的通道。它应该只寻找不超过通道的最大高度和不短于通道的最小时间间隔的通道。
如果我们选择Bar_Time作为通道时间,通道(1)的计算是从当前时间减去设置中给出的时间,即2小时15分或其他时间。 如果现在是1小时15分,它从23小时00分开始寻找最大值和最小值,如果最大值减去最小值低于最大通道高度,它将画出23:00到02:15的两条最大值和最小值线。它还画出了通道上方和下方的费波水平。

如果我们选择按条数计算Bar_Time,那么通道的计算就是从当前条数减去设置中指定的条数,即从零条到零条减去设置中指定的条数。如果选择的数字是50,我们搜索从零条开始的最后50条的高点和低点,如果高点减去低点不超过最大通道高度,将画出50条高点和低点的两条线。

所有级别和通道数据都存储在缓冲区内

 

向伊戈尔提问

如果你能给我一个专家顾问的代码片段,在两个独立的账户上工作(买入卖出),轮询每个账户的状态(计算手数),并有能力将存款从一个账户转移到另一个账户,以及模拟在某些条件下提取部分存款(例如每月或每季度的利润 - 从它n%)。

让我澄清一下我的问题

1 专家顾问在购买时工作(账户2的民意调查状态)。6200

2 专家顾问打开卖出头寸(要求账户余额为1) ...8400

如果没有空缺职位

1100从账户2到账户1

账户1 - 7300

账户2 - 7300

存款总额SD=14600 最大风险 - 10% 最大手数0.14

更多

截至09年4月1日,SD=10000

截至09年7月1日,SD=14600

利润=4600

10% = 460

在第三个账户中扣除460元

谢谢你

 

亲爱的伊戈尔,帮帮我吧!

我连接了a-SimpleTrailing.mqh

添加了指定的内容,但跳出了3个错误

'clModifyBuy' - 未定义变量
'clModifySell' - 未定义变量
'ti' - 已定义变量

怎么办?(



这里有适合的东西。

.........................
   total=OrdersTotal();
   if( total<1)
     {
      if(AccountFreeMargin()<(1000* Lots))
        {
         Print("У вас нет денег. Свободные средства = ", AccountFreeMargin());
         return(0);
        }
      if(Hour()>=0)
        {
         chk=1;
         Print("Позиция возможна!");
        }
      if( chk==1)
        {
         if((Low[0]<= MaDert1sell) || (Low[0]<= MaDert2sell))
           {
int ti= OpenPosition(NULL, OP_BUY, 0.1);
if (OrderSelect( ti, SELECT_BY_TICKET))
ModifyOrder(-1, Ask-30*Point, Bid-99*Point, clModifySell);
            if( ticket>0)
              {
               if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES))
                  Print("Открыт ордер SELL : ",OrderOpenPrice());
               chk=0;
              }
            else
              {
               Print("Ошибка открытия SELL ордера : ",GetLastError());
               return(0);
              }
           }
         if((High[0]>= MaDert1buy) || (High[0]>= MaDert2buy))
           {
int ti= OpenPosition(NULL, OP_BUY, 0.1);
if (OrderSelect( ti, SELECT_BY_TICKET))
ModifyOrder(-1, Ask-30*Point, Bid-99*Point, clModifyBuy);
            if( ticket>0)
              {
               if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES))
                  Print("Открыт ордер BUY : ",OrderOpenPrice());
               chk=0;
              }
            else
              {
               Print("Ошибка открытия BUY ордера : ",GetLastError());
               return(0);
              }
           }
        }
      return(0);
     }
   for( cnt=0; cnt< total; cnt++)
     {
      OrderSelect( cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL &&   // это открытая позиция? OP_BUY или OP_SELL 
         OrderSymbol()==Symbol())  // инструмент совпадает?
        {
         if(OrderType()==OP_BUY)   // открыта длинная позиция
           {
            // проверим, может уже пора закрываться?
            if(Hour()==23)
              {
               chk=0;
               OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // закрываем позицию
               return(0); // выходим
              }
           }
         else // иначе это короткая позиция
           {
            // проверим, может уже пора закрываться?
            if(Hour()==23)
              {
               chk=0;
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // закрываем позицию
               return(0); // выходим
              }

           }
        }
     }
   return(0);
  }

//+----------------------------------------------------------------------------+
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.11.2006                                                     |
//|  Описание : Модификация одного предварительно выбранного ордера.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    pp - цена установки ордера                                              |
//|    sl - ценовой уровень стопа                                              |
//|    tp - ценовой уровень тейка                                              |
//|    cl - цвет значка модификации                                            |
//+----------------------------------------------------------------------------+
void ModifyOrder(double pp=-1, double sl=0, double tp=0, color cl=CLR_NONE) {
  bool   fm;
  double op, pa, pb, os, ot;
  int    dg=MarketInfo(OrderSymbol(), MODE_DIGITS), er, it;
 
  if ( pp<=0) pp=OrderOpenPrice();
  if ( sl<0 ) sl=OrderStopLoss();
  if ( tp<0 ) tp=OrderTakeProfit();
  
  pp=NormalizeDouble( pp, dg);
  sl=NormalizeDouble( sl, dg);
  tp=NormalizeDouble( tp, dg);
  op=NormalizeDouble(OrderOpenPrice() , dg);
  os=NormalizeDouble(OrderStopLoss()  , dg);
  ot=NormalizeDouble(OrderTakeProfit(), dg);
 
  if ( pp!= op || sl!= os || tp!= ot) {
    for ( it=1; it<= NumberOfTry; it++) {
      if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
      while (!IsTradeAllowed()) Sleep(5000);
      RefreshRates();
      fm=OrderModify(OrderTicket(), pp, sl, tp, 0, cl);
      if ( fm) {
        if ( UseSound) PlaySound( NameFileSound); break;
      } else {
        er=GetLastError();
        pa=MarketInfo(OrderSymbol(), MODE_ASK);
        pb=MarketInfo(OrderSymbol(), MODE_BID);
        Print("Error(", er,") modifying order: ", ErrorDescription( er),", try ", it);
        Print("Ask=", pa,"  Bid=", pb,"  sy=",OrderSymbol(),
              "  op="+ GetNameOP(OrderType()),"  pp=", pp,"  sl=", sl,"  tp=", tp);
        Sleep(1000*10);
      }
    }
  }
}
//+----------------------------------------------------------------------------+
//|  Возвращает наименование торговой операции                                 |
//|  Параметры:                                                                |
//|    op - идентификатор торговой операции                                    |
//+----------------------------------------------------------------------------+
string GetNameOP(int op) {
	switch ( op) {
		case OP_BUY      : return("Buy");
		case OP_SELL     : return("Sell");
		case OP_BUYLIMIT : return("Buy Limit");
		case OP_SELLLIMIT: return("Sell Limit");
		case OP_BUYSTOP  : return("Buy Stop");
		case OP_SELLSTOP : return("Sell Stop");
		default          : return("Unknown Operation");
	}
}
//+----------------------------------------------------------------------------+