初学者的问题 MQL4 MT4 MetaTrader 4 - 页 72

 
Vitalie Postolache:


我也会说同样的话。你不擅长逻辑。根据可用资金和风险值(我想写的是3%),立即计算出初始手数,有什么问题?为什么你必须在一个地方做所有事情?

取自由保证金的数值,乘以风险,再除以100,即为1手的保证金数值--这里是最简单的计算公式,即用自由保证金的指定百分比来计算手数。另外,你需要考虑到换手的步骤,防止超过经纪公司允许的最小/最大手数。


我告诉你,EA的交易时间很短,其中有一个概率是连续9个相反的订单相互重叠打开,每个下一个订单都乘以2,所以保证金可能无法保持,最后一个挂单 可能无法打开,因此我们必须从最后可能的最大手数开始计算。一般来说,我需要计算一个保证金,如果所有的订单都将被打开,并在这些数据的基础上按相反的顺序计算出第一手。

 
如果(OrdersTotal() >= OrderCount)
{
返回。
}
//----
如果(r > 50 && p > m)//打开购买订单
{
ticketB = OrderSend(Symbol(),OP_BUY,0.1,Ask,5,0,0,",111,0,Green); //打开买入订单
}
//-----
如果(r < 50 && p < m)//开放卖出订单条件
{
ticketS = OrderSend(Symbol(),OP_SELL,0.1,Bid,5,0,0,",111,0,Blue)。
}
//----- 关闭订单
for (int i=1; i<=OrdersTotal(); i++)
{
如果(OrderSelect(ticketB,SELECT_BY_TICKET) ==true)
{
如果(r < 50 && p < m)
{
OrderClose(ticketB,0.1,Bid,5,Red)。
}
}

}

我哪里拼错了? 我想我是从一个例子中得到的,你能不能告诉我如何正确地拼写它,这样订单就会关闭。

我正在绞尽脑汁。

 
funnyrain8:
如果(OrdersTotal() >= OrderCount)
{
返回。
}
//----
如果(r > 50 && p > m)//打开购买订单
{
ticketB = OrderSend(Symbol(),OP_BUY,0.1,Ask,5,0,0,",111,0,Green); //打开买入订单
}
//-----
如果(r < 50 && p < m)//开放卖出订单条件
{
ticketS = OrderSend(Symbol(),OP_SELL,0.1,Bid,5,0,0,",111,0,Blue)。
}
//----- 关闭订单
for (int i=1; i<=OrdersTotal(); i++)
{
如果(OrderSelect(ticketB,SELECT_BY_TICKET) ==true)
{
如果(r < 50 && p < m)
{
OrderClose(ticketB,0.1,Bid,5,Red)。
}
}

}

我哪里拼错了? 我想我是从一个例子中得到的,你能不能告诉我如何正确地拼写它,这样订单就会关闭。

我正在绞尽脑汁。


 if(OrdersTotal()>=OrderCount)  //Обрати внимание на эту конструкцию
     {                            //
      return;
     }
//---- 
   if(r>50 && p>m) //условия открытия ордера на покупку
     {
      for(int i=1; i<=OrdersTotal(); i++)
        {
         if(OrderSelect(ticketB,SELECT_BY_TICKET)==true)
           {
            if(OrderType()==OP_SELL)
              {
               OrderClose(OrderTicket(),0.1,Ask,5,Red);
              }
           }
        }
      ticketB=OrderSend(Symbol(),OP_BUY,0.1,Ask,5,0,0,"",111,0,Green); //открыnие ордера на покупку     

     }

//-----     
   if(r<50 && p<m) //условия открытия ордера на продажу
     {
     for(int i=1; i<=OrdersTotal(); i++)
        {
         if(OrderSelect(ticketB,SELECT_BY_TICKET)==true)
           {
            if(OrderType()==OP_BUY)
              {
               OrderClose(OrderTicket(),0.1,Bid,5,Red);
              }
           }
        }
      ticketS=OrderSend(Symbol(),OP_SELL,0.1,Bid,5,0,0,"",111,0,Blue);
     }

像这样
 
funnyrain8:
如果(OrdersTotal() >= OrderCount)
{
返回。
}
//----
如果(r > 50 && p > m)//打开购买订单
{
ticketB = OrderSend(Symbol(),OP_BUY,0.1,Ask,5,0,0,",111,0,Green); //打开买入订单
}
//-----
如果(r < 50 && p < m)//开放卖出订单条件
{
ticketS = OrderSend(Symbol(),OP_SELL,0.1,Bid,5,0,0,",111,0,Blue)。
}
//----- 关闭订单
for (int i=1; i<=OrdersTotal(); i++)
{
如果(OrderSelect(ticketB,SELECT_BY_TICKET) ==true)
{
如果(r < 50 && p < m)
{
OrderClose(ticketB,0.1,Bid,5,Red)。
}
}

}

我哪里拼错了? 我想我是从一个例子中得到的,你能不能告诉我如何正确地拼写它,这样订单就会关闭。

我正在绞尽脑汁。


如果订单在票据上被选中,你就不需要在循环中进行操作。如 果你想纠正代码,请使用SRC按钮将代码粘贴到信息 中。
 
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict    
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
int ticketB,ticketS;
void OnTick()
//------------------------------------------------------------------------------------------------
{
double p = iClose("EURUSD",PERIOD_M15,0);                                    //показание текущей цены 
double r = iRSI  ("EURUSD",PERIOD_M15,21,PRICE_CLOSE,0);                     //значение индюка RSI
double m = iMA   ("EURUSD",PERIOD_M15,89,0,MODE_EMA,PRICE_CLOSE,0);          //значение индюка МА
int    OrderCount  = 1;

//---------------ПОДСЧЕТ ОРДЕРОВ------------------------------------------------------------------
if(OrdersTotal() >= OrderCount)
          {
             return;
          }   
//-------------ОТКРЫТИЕ ОРДЕРА НА ПОКУПКУ--------------------------------------------------------------------
/*if(r > 50 && p > m)                                                        //условия открытия ордера на покупку
    {   
        ticketB = OrderSend(Symbol(),OP_BUY,0.1,Ask,5,0,0,"",111,0,Green);         
    }
//------------ЗАКРЫТИЕ ОРДЕРА НА ПРОДАЖУ--------------------------------------------------------
if(r<50 && p<m)                                                           
     {
      for(int i=1; i<=OrdersTotal(); i++)
        {
         if(OrderSelect(ticketB,SELECT_BY_TICKET)==true)
           {
            if(OrderType()==OP_BUY)
              {
                  ticketB = OrderClose(OrderTicket(),0.1,Bid,5,Red);
              }
           }
        }
     }*/
//------------------ОТКРЫТИЕ ОРДЕРА НА ПРОДАЖУ---------------------------------------------------------
if(r < 50 && p < m)                                                        //условия открытия ордера на продажу
    {
        ticketS = OrderSend(Symbol(),OP_SELL,0.1,Bid,5,0,0,"",111,0,Blue); 
    } 
//---------------------ЗАКРЫТИЕ ОРДЕРА НА ПРОДАЖУ---------------------------------------------------------
if(r>50 && p>m) 
     {
   for(int i=1; i<=OrdersTotal(); i++)
        {
         if(OrderSelect(ticketS,SELECT_BY_TICKET)==true)
           {
            if(OrderType()==OP_SELL)
              {
                  ticketS = OrderClose(OrderTicket(),0.1,Ask,5,Red);
              }
           }
        }
     }
}
//+------------------------------------------------------------------+
谢谢你的SRC),这就是它的样子,TS看起来是这样的,当蜡烛收盘低于wop和rsi低于50时,卖出应该发生,并在相反的条件下关闭订单,同时在收盘后买入应该发生,收盘后,然后一个订单,没有更多,如此循环...但现在我有一个订单打开,这就是它,和停止不工作...
 
funnyrain8:
谢谢你的SRC),这就是它的样子,ts看起来是这样的,卖出应该发生在蜡烛收盘低于手腕和rsi低于50的时候,并在相反的条件下关闭订单,同时在收盘后应该发生买入和收盘后,然后一个订单,没有更多,如此循环...但现在我打开一个订单和所有,和停止不工作...


我已经用自己的风格重写了,我希望你能理解,如果有不清楚的地方,请不要犹豫,请问

//+------------------------------------------------------------------+
//|                                                   funnyrain8.mq4 |
//|                                                   Sergey Gritsay |
//|                         https://www.mql5.com/ru/users/sergey1294 |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritsay"
#property link      "https://www.mql5.com/ru/users/sergey1294"
#property version   "1.00"
#property strict

input int             MagicNumber  = 20110315;       // Номер копии
input string          CommentOrder = "Origenal";     // Комментарий к ордеру
input int             Slippage=100;             // Проскальзование (Пипс)
input double          Lot=0.01;           // Объем лота 
input int             SignalBar=0; // Сигнальный бар 

sinput string            s1=NULL; // Setting indicator slow МА
input int                ma_period=89;    // Period
input ENUM_MA_METHOD     ma_method=MODE_EMA;//Method calculation
input ENUM_APPLIED_PRICE ma_price=PRICE_CLOSE;//Price calculation

sinput string            s2=NULL; // Setting indicator RSI
input int                rsi_period=21; // Period
input ENUM_APPLIED_PRICE rsi_price=PRICE_CLOSE;//Price calculation
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(TotalOrder()==0)OrderOpen(GetSignal());
   else OrderClose(GetSignal());
  }
//+------------------------------------------------------------------+
int GetSignal()
  {
   double rsi = iRSI(_Symbol,PERIOD_CURRENT,rsi_period,rsi_price,SignalBar);                     //значение индюка RSI
   double ma = iMA   (_Symbol,PERIOD_CURRENT,ma_period,0,ma_method,ma_price,SignalBar);          //значение индюка МА

   if(Close[SignalBar]>ma && rsi>50.0)return(OP_BUY);
   if(Close[SignalBar]<ma && rsi<50.0)return(OP_SELL);
   return(WRONG_VALUE);
  }
//+------------------------------------------------------------------+
int TotalOrder()
  {
   int value=0;
   int total=OrdersTotal();
   for(int i=total-1; i>=0; i--)
     {
      if(!OrderSelect(i,SELECT_BY_POS))continue;
      if(OrderSymbol()!=_Symbol)continue;
      if(OrderMagicNumber()!=MagicNumber)continue;
      if(OrderType()>1)continue;
      value++;
     }
   return(value);
  }
//+------------------------------------------------------------------+
void OrderOpen(int type)
  {
   if(type==WRONG_VALUE)return;
   double price_open=(type==OP_BUY)?NormalizeDouble(Ask,_Digits):NormalizeDouble(Bid,_Digits);
   int ticket=OrderSend(_Symbol,type,Lot,price_open,Slippage,0,0,CommentOrder,MagicNumber);
   if(ticket<0)Print("Ошибка открытия ордера № - ",GetLastError());
  }
//+------------------------------------------------------------------+
void OrderClose(int type)
  {
   if(type==WRONG_VALUE)return;
   int total=OrdersTotal();
   for(int i=total-1; i>=0; i--)
     {
      if(!OrderSelect(i,SELECT_BY_POS))continue;
      if(OrderMagicNumber()!=MagicNumber)continue;
      if(OrderSymbol()!=_Symbol)continue;
      if(OrderType()!=type)continue;
      double price_close=(type==OP_BUY)?NormalizeDouble(Bid,_Digits):NormalizeDouble(Ask,_Digits);
      bool res=OrderClose(OrderTicket(),OrderLots(),price_close,Slippage);
      if(!res)Print("Ошибка закрытия ордера № - ",GetLastError());
     }
  }
//+------------------------------------------------------------------+

...

 
Sergey Gritsay:


用我自己的风格重写,希望你能理解,如果你有什么不明白的地方,请问

...


哦,我想我几乎写了所有的东西,除了结尾,我还有很多东西要学......非常感谢,现在至少我有一个例子可以借鉴......锡,再次感谢)
 
你好。我已经下载了Metatrader 5软件。我报名参加了2个信号。我的账户余额为正20美元。我正在尝试安装虚拟主机,但没有任何效果。我按导航仪,连接到交易账户,我甚至在虚拟主机表中没有这样的标签。我正在给你发截图。我怎样才能连接到共享主机?
附加的文件:
3p46y0.jpg  273 kb
g4ppe22.jpg  264 kb
 
Жанна Платонова:
你好。我已经下载了Metatrader 5软件。我报名参加了2个信号。我的账户余额为正20美元。我正在尝试安装虚拟主机,但没有任何效果。我按导航仪,连接到交易账户,我甚至在虚拟主机表中没有这样的标签。我正在给你发截图。我怎样才能连接到共享主机?

点击主菜单 中的帮助。
 
你好。我有一个问题--在mac(sierra)上,在所有交付的(通过wine)不同公司的平台mt4上都有同样的故障--终端如果你把它从底部的正常位置释放出来,把它作为一个自由窗口移动--它就会缩小,通过它工作是完全不可能的。禁用自动排列器并不奏效。要在以前的地方归还终端是绝对不可能的--也就是说,它根本无法连接,也无法再打开。我有个问题--谁能知道有什么快捷方式或按钮能让整个界面回到原来的位置。真诚的。