[存档]任何菜鸟问题,为了不使论坛变得杂乱无章。专业人士,不要路过。没有你就无处可去 - 3. - 页 10

 
tol64:
您能否告知,在开仓/设置挂单 时,是否可以通过程序确定立即设置止损/止盈的 可能性,还是事后?


事先检查止损和盈利水平。

MarketInfo() 函数中使用的请求标识符。可以是以下数值之一。

恒定. 价值 描述
MODE_LOW 1 每日最低价格
MODE_HIGH 2 每日最高价格
MODE_TIME 5 最后一次报价的时间
MODE_BID 9 最后收到的投标价格。对于当前的仪器,它被储存在预定义的变量Bid 中。
MODE_ASK 10 最后收到的询问价格。存储在预定义的变量中询问 当前的符号
模式_POINT 11 报价货币中的点尺寸。存储在当前符号的预定义变量Point
MODE_DIGITS 12 票据价格中小数点后的数字。存储在当前符号的预定义变量Digits
MODE_SPREAD 13 点差,以点计
MODE_STOPLEVEL 14 止损/止盈的最低允许水平,单位为点
MODE_LOTSIZE 15 以工具的基础货币为单位的合同规模
MODE_TICKVALUE 16 票据价格在存款货币中的最小变化规模
MODE_TICKSIZE 17 报价货币的工具价格变化的最小步骤
MODE_SWAPLONG 18 多头头寸的互换规模
MODE_SWAPSHORT 19 空头头寸的互换规模
MODE_STARTING 20 日历开始日期(通常用于期货)。
模式_失效 21 到期日(通常用于期货)。
允许交易的模式 22 允许交易指定的工具
MODE_MINLOT 23 最小地段面积
MODE_LOTSTEP 24 地段面积变化的步骤
MODE_MAXLOT 25 最大地段面积
MODE_SWAPTYPE 26 掉期计算方法。0--以点为单位;1--以工具基础货币为单位;2--以百分数为单位;3--以保证金货币为单位。
模式_性能校准模式 27 利润计算方式。0-外汇;1-差价合约;2-期货
mode_margincalcmode 28 计算保证金的方式。0-外汇;1-差价合约;2-期货;3-指数差价合约
mode_margininit 29 1手的初始保证金要求
模式_marginmaintenance 30 支持每1手未平仓合约所需的保证金金额
模式_保证金对冲 31 每1手重叠头寸收取的保证金
mode_marginrequired 32 自由资金的数量,需要打开1手购买
mode_freezelevel 33 以点为单位的订单冻结水平。如果执行价格在冻结水平定义的范围内,订单不能被修改、取消或关闭。

 
SeALALex:

我只是在学习如何编写EA,就像我在标准指标上的许多第一个EA一样,我刚刚编写了一个新的EA,但现在我的任务复杂了。在一般情况下,如何使,在出现的条件下打开一个位置,并在其关闭,例如,对于采取相同的条件,一个新的没有打开,并打开时,相反的条件,等等。谢谢!!!。


在帮助中,有一个现成的例子

int i,accTotal=OrdersHistoryTotal(); for(i=0;i<accTotal;i++) { //---- 检查选择结果 if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error accessing historical database (",GetLastError()," ); break;
       } 我们需要记住订单关闭的时间,将订单关闭的时间与上一次迭代中的关闭时间进行比较,如果(关闭时间较高且交易操作类型为买入或卖出),那么我们应该记住当前订单的时间和交易操作类型//作为一个结果,在循环结束时我们知道最后关闭的订单类型 } 类似这样。

 
ivandurak:


预先检查止损和利润设置水平 .


在这个列表中,某些账户类型没有检查。以下是《交易操作规程》中关于NDD账户的一段话。

3.3 如果通过客户终端使用专家顾问开仓,客户不能指定止损和/或止盈订单。如果客户希望下这些订单,客户可以根据条款5.16-5.22和9.13-9.16修改现有头寸。

我想知道是否有可能以编程方式检查这个问题。根据我的理解,没有。你必须首先在程序中写入一个开仓/设置挂单的功能,同时考虑到经纪人设置的条件。
 
tol64:


在这个列表中,某些账户类型没有检查。以下是《交易操作规程》中关于NDD账户的一段话。

我感兴趣的是,这是否可以通过编程来检查。根据我的理解,没有。你必须最初在程序中写入一个开仓/设置挂单的功能,并考虑到经纪人设置的条件。

我不太了解设置订单的规则,试着玩玩演示,看看你能做什么,不能做什么。据我所知,没有什么能阻止你以编程方式设置一个订单,然后再修改它。 对,这很奇怪,除非你在开仓后 切断连接,不留止损。
 
tol64:


在这个列表中,某些账户类型没有检查。以下是《交易操作规程》中关于NDD账户的一段话。

我感兴趣的是,这是否可以通过编程来检查。据我所知,没有。你必须首先在程序中写入一个开仓/设置挂单的函数,同时考虑到经纪人设置的条件。

根本就没有问题。甚至(如果不是个人使用,因为你知道在哪些账户上(交易条件和与谁)使用它),但如果你发送EA订单,而客户尚未决定在哪些账户上和在哪里使用,甚至在账户类型上有可能立即设置采取和停止,然后默认产生EA与这些水平的零值,当设置所有类型的订单,然后与他们修改(将在那里和那里工作),同时,当然,没有人取消检查要求和限制在P。
 
ivandurak:

我不太理解设置订单的规则,试着用演示来玩,什么可以,什么不可以。据我所知,没有什么能阻止你以编程方式设置一个订单,然后修改它。 这似乎很奇怪,除非你在开仓后切断了连接,没有留下止损。

)))不,你完全误解了我的意思。我没有写 "用程序设置",我写的是用程序定义。在某些账户类型上,你不能立即 开仓 并设置止损/止赢,这对我来说是比较好的/安全的。在mql5 上,如果我没有弄错的话,似乎可以确定这一点。我希望能够确定这一点,并根据定义,选择使用哪个函数。
 
Roman.:

根本就没有问题。甚至(如果不是为了个人使用,因为你知道在哪些账户上(交易条件和与谁)使用它),但如果你做一个EA来订购,而客户还没有决定在哪些账户上和在哪里使用它,甚至在账户类型上有可能立即设置采取和停止,那么你仍然做一个EA,在设置所有类型的订单时,这些水平的默认值为零,然后与他们修改(将在那里和那里工作),同时,当然,无人取消检查要求和限制在P

是的,有了解决方案就没有问题了。你只需要使用你所拥有的并正确地使用它)。
 

Roman. ivandurak 非常感谢你们的回答,但这对我来说还是很难理解。 我在另一个论坛上发现了一个关于如何做到这一点的建议,但到目前为止,我无法将其应用到我的常规代码中。

int BuyTrue, SellTrue;//定义将作为这些标志的变量
....
//---购买条件
如果(BuyTrue==0 && ... 加上你的其他条件)//开仓条件
{
....
OrderSend(....); //开设订单的函数
BuyTrue=1; // 如果BuyTrue=1,开仓条件将不完全满足。
// 因此,在一个重复的买入信号下,交易将不会被打开。
SellTrue=0; // 在SellTrue=0时,开仓条件将得到完全满足。
// 因此,下一个交易将是只卖出
....
}

//---卖出条件
如果(SellTrue==0 && ... 加上你的其他条件)//开仓条件
{
....
OrderSend(....); //开设订单的函数
SellTrue=1; // 如果SellTrue=1,订单开仓的条件将不完全满足
// 因此,在第二个卖出信号时,将不会开仓。
BuyTrue=0; // 在BuyTrue=0时,开仓条件将得到完全满足。
// 因此,下一个交易将是买入。
....
}

我的开仓代码

total=OrdersTotal()。
如果(total<1)
{
// 没有发现已开的订单
如果(AccountFreeMargin()<(1000*Lots))
{
Print("我们没有钱。Free Margin = ", AccountFreeMargin();
return(0);
}
// 检查多头头寸(买入)。
如果(MACD1<0 && MACD2<MACD1 && MACD2>MACD3 && MathAbs(MACD1)>(MACDOpenLevel*Point))
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point, "macd sample",16384,0,Green);
如果(ticket>0)
{
如果(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))Print("BUY订单打开:",OrderOpenPrice())。
}
else Print("错误打开BUY订单:",GetLastError())。
return(0);
}
// 检查空头头寸(卖出)。
如果(MACD1>0 && MACD2>MACD1 && MACD1>(MACDOpenLevel*Point))
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point, "macd sample",16384,0,Red)。
如果(ticket>0)
{
如果(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))Print("卖出订单开仓:",OrderOpenPrice())
}
else Print("错误打开卖出订单:",GetLastError())。
return(0);
}
return(0);
}

 
SeALALex:

Roman. ivandurak 非常感谢你们的回答,但这对我来说还是很难理解。 我在另一个论坛上发现了一个关于如何做到这一点的建议,但到目前为止,我无法将其应用到我的常规代码中。

int BuyTrue, SellTrue;//定义变量,这些变量将作为上述标志。
....
//---购买条件
如果(BuyTrue==0 && ... 加上你的其他条件)//开仓条件
{
....
OrderSend(....); //开设订单的函数
BuyTrue=1; // 如果BuyTrue=1,开仓条件将不完全满足。
// 因此,在重复的买入信号下,将不会开仓。
SellTrue=0; // 在SellTrue=0时,开仓条件将得到完全满足。
// 因此,下一个交易将是只卖出
....
}

//---卖出条件
如果(SellTrue==0 && ... 加上你的其他条件)//开仓条件
{
....
OrderSend(....); //开设订单的函数
SellTrue=1; // 如果SellTrue=1,订单开仓的条件将不完全满足
// 因此,在一个重复的卖出信号下,将不会开仓。
BuyTrue=0; // 在BuyTrue=0时,开仓条件将得到完全满足。
// 因此,下一个交易将是买入。
....
}

我开启交易的代码。

total=OrdersTotal()。
如果(total<1)
{
// 没有发现已开的订单
如果(AccountFreeMargin()<(1000*Lots))
{
Print("我们没有钱。Free Margin = ", AccountFreeMargin();
return(0);
}
// 检查多头头寸(买入)。
如果(MACD1<0 && MACD2<MACD1 && MACD2>MACD3 && MathAbs(MACD1)>(MACDOpenLevel*Point))
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point, "macd sample",16384,0,Green);
如果(ticket>0)
{
如果(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))Print("BUY订单打开:",OrderOpenPrice())。
}
else Print("错误打开BUY订单:",GetLastError())。
return(0);
}
// 检查空头头寸(卖出)。
如果(MACD1>0 && MACD2>MACD1 && MACD1>(MACDOpenLevel*Point))
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point, "macd sample",16384,0,Red)。
如果(ticket>0)
{
如果(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))Print("卖出订单开仓:",OrderOpenPrice())
}
else Print("错误打开卖出订单:",GetLastError())。
return(0);
}
return(0);
}


首先,通过Ctrl+Alt+M(或按菜单顶部的SRC)在编辑器中粘贴你的代码,否则就不好了,什么是清楚的--一切都融合在一起...:-))

第二,阅读教程,特别是我推荐的链接上的信息,代码下面是它的描述,在描述的最后,精确地描述了--如何在MA之上/之下报告一次 价格(你将有一个类似于在给定的交易条件下的单一入口 --标志的使用和所有),在你的Wizard工作之前...:-))

P.S. or google search: How to properly insert code site:mql4.com

 






if (SellTrue==0 && A1<A2 && S1<30 && ADX1<ADX2) // Условие открытия позы
        {
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,"AO sample",16384,0,Red);
           if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES ||SellTrue==1)) Print("SELL order opened : ",OrderOpenPrice());
           }
         else Print("Error opening SELL order : ",GetLastError()); 
        
        if (ticket > 0 && SellTrue==1)   
     {
      SellTrue=1;
      BuyTrue=0;                 
      Alert("По данным условиям сделка уже открывалась"); // Сообщение 
     }
        }
      return(0);
罗马人。 它不工作,怎么了?