//+------------------------------------------------------------------+//| MACD Sample.mq4 |//| Copyright 2005-2014, MetaQuotes Software Corp. |//| http://www.mql4.com |//+------------------------------------------------------------------+#property copyright"2005-2014, MetaQuotes Software Corp."#property link"http://www.mql4.com"inputdouble TakeProfit =2190;
inputdouble Lots =0.5;
inputdouble TrailingStop =650;
inputint OpenLevel =70;
inputint CloseLevel=23;
inputintPeriod =86;
inputint Period1 =87;
int LastBars=0;
externint Magic1 = 110721;
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+voidOnTick(void)
{
int cnt,ticket,total;
//---// initial data checks// it is important to make sure that the expert works with a normal// chart and the user did not make any mistakes setting external // variables (Lots, StopLoss, TakeProfit, // TrailingStop) in our case, we check TakeProfit// on a chart of less than 100 bars//---//--- Trade only if new bar has arrivedif(LastBars!=Bars) LastBars=Bars;
elsereturn(0);
if(Bars<100)
{
Print("bars less than 100");
return;
}
if(TakeProfit<10)
{
Print("TakeProfit less than 10");
return;
}
//--- to simplify the coding and speed up access data are put into internal variablesif(CountOrders("", -1,Magic1)<1)
total=OrdersTotal();
if(total<1)
{
//--- no opened orders identifiedif(AccountFreeMargin()<(1000*Lots))
{
Print("We have no money. Free Margin = ",AccountFreeMargin());
return;
}
//--- check for long position (BUY) possibilityif(iRSI(NULL,0,OpenLevel,PRICE_LOW,Period)>iRSI(NULL,0,CloseLevel,PRICE_HIGH,Period1))
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-TakeProfit*Point,Bid+TakeProfit*Point,"GBPCADD",Magic1,0,Green);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("BUY order opened : ",OrderOpenPrice());
}
elsePrint("Error opening BUY order : ",GetLastError());
return;
}
//--- check for short position (SELL) possibilityif(iRSI(NULL,0,OpenLevel,PRICE_LOW,Period1)<iRSI(NULL,0,CloseLevel,PRICE_HIGH,Period))
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Ask+TakeProfit*Point,Ask-TakeProfit*Point,"GBPCADD",Magic1,0,Red);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("SELL order opened : ",OrderOpenPrice());
}
elsePrint("Error opening SELL order : ",GetLastError());
}
//--- exit from the "no opened orders" blockreturn;
}
//--- it is important to enter the market correctly, but it is more important to exit it correctly... for(cnt=0;cnt<total;cnt++)
{
if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
continue;
if(OrderType()<=OP_SELL && // check for opened position
OrderSymbol()==Symbol()&& OrderMagicNumber()==Magic1) // check for symbol
{
//--- long position is openedif(OrderType()==OP_BUY)
{
//--- should it be closed?if(iRSI(NULL,0,OpenLevel,PRICE_LOW,Period1)<iRSI(NULL,0,CloseLevel,PRICE_HIGH,Period))
{
//--- close order and exitif(!OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet))
Print("OrderClose error ",GetLastError());
return;
}
//--- check for trailing stopif(TrailingStop>0)
{
if(Bid-OrderOpenPrice()>Point*TrailingStop)
{
if(OrderStopLoss()<Bid-Point*TrailingStop)
{
//--- modify order and exitif(!OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green))
Print("OrderModify error ",GetLastError());
return;
}
}
}
}
else// go to short position
{
//--- should it be closed?if(iRSI(NULL,0,OpenLevel,PRICE_LOW,Period)>iRSI(NULL,0,CloseLevel,PRICE_HIGH,Period1))
{
//--- close order and exitif(!OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet))
Print("OrderClose error ",GetLastError());
return;
}
//--- check for trailing stopif(TrailingStop>0)
{
if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
{
if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
{
//--- modify order and exitif(!OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red))
Print("OrderModify error ",GetLastError());
return;
}
}
}
}
}
}
//---
}
//+------------------------------------------------------------------+//+----------------------------------------------------------------------------+//| Подсчет ордеров |//+----------------------------------------------------------------------------+//| -1 - Все типы ордеров |//| 0 - ордера типа BUY |//| 1 - ордера типа SELL |//| 2 - ордера типа BUYLIMIT |//| 3 - ордера типа SELLLIMIT |//| 4 - ордера типа BUYSTOP |//| 5 - ордера типа SELLSTOP |//+----------------------------------------------------------------------------+int CountOrders(string symb="", int or_ty=-1, int magiс=-1)
{
int cnt=0;
if(symb=="0") symb=_Symbol;
for(int pos=OrdersTotal()-1;pos>=0;pos--)
{
if(OrderSelect(pos,SELECT_BY_POS)==true)
{
if((OrderSymbol()==symb || symb=="")&&(or_ty<0 || or_ty==OrderType()))
{
if(magiс<0 || OrderMagicNumber()==magiс) cnt++;
}
}
}
return(cnt);
}
Включение файлов (#include) - Препроцессор - Основы языка - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
这是正确的做法吗?
这是正确的做法吗?
谢谢你,这很复杂,我已经把它简化了,只有几行。
谢谢你,这很复杂,我把它简化了,只有几行。
有趣的是,如果
for(i=k; i>=0; i--) {
如果(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
如果(OrderSymbol()==Symbol()){
如果(OrderMagicNumber()== Magic) {
{ 如果(OrderType()>1)继续。
如果(OrderType()==OP_BUY || OrderType()==OP_SELL) total++;
}}}}
//---
// total=OrdersTotal()。
如果(total<1)
{
大家好,我想创建自己的函数库,因为我经常在我的机器人中使用相同的函数。我所做的一切都是正确的。我创建了这个库,把它放在Libraries文件夹中,然后用#import把它插入我的指标中。
#import "andylib.ex4".
bool KeyPr (long l, string k);
string TestFunc()。
##进口
库中指定的函数,并有说明。但库中的函数没有被调用。我试着把对话框放在指标的文件夹里,甚至直接放在连接到对话框的指标的同一个文件夹里,都没有结果。问题可能是什么?
大家好,我想创建自己的函数库,因为我经常在我的机器人中使用相同的函数。我所做的一切都是正确的。我创建了这个库,把它放在Libraries文件夹中,然后用#import把它插入我的指标中。
#import "andylib.ex4".
bool KeyPr (long l, string k);
string TestFunc()。
##进口
库中指定的函数,并有说明。但库中的函数没有被调用。我试着把对话框放在指标的文件夹里,甚至直接放在连接到对话框的指标的同一个文件夹里,都没有结果。问题可能是什么?
包括
for(i=k; i>=0; i--) {
如果(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
如果(OrderSymbol()==Symbol()){
如果(OrderMagicNumber()== Magic) {
{ 如果(OrderType()>1)继续。
如果(OrderType()==OP_BUY || OrderType()==OP_SELL) total++;
}}}}
//---
// total=OrdersTotal()。
如果(total<1)
{
你写的东西不可能成功。
首先,你计算 "total++",然后清零并设置 "OrdersTotal()",即所有订单
大家好,我想创建自己的函数库,因为我经常在我的机器人中使用相同的函数。我所做的一切都是正确的。我创建了这个库,把它放在Libraries文件夹中,然后用#import把它插入我的指标中。
#import "andylib.ex4".
bool KeyPr (long l, string k);
string TestFunc()。
##进口
库中指定的函数,并有说明。但库中的函数没有被调用。我试着把对话框放在指标的文件夹里,甚至直接放在连接到对话框的指标的同一个文件夹里,都没有结果。问题可能是什么?
你是否记得在库中的函数名称后面写上导出?
更好的办法是,不要做一个库,而是做一个带有函数的.mqh文件,即使没有类,编译时也只取那些需要的函数,并从EA/指示器中调用。