int y; int totalOrders = 4; datetime toT; // Time of Trade datetime doT; // Day of Trade datetime now = TimeCurrent(); datetime boD=now-now%86400; // Beginning of day
if (AccountProfit()>= profitTarget)
{
for(y=0;y<totalOrders; y++) {
if(OrderSelect(y,SELECT_BY_POS,MODE_HISTORY)) { toT=OrderOpenTime(); // Time of Trade doT=toT-toT%86400; // Day of Trade. if(doT==boD) { // Time of Trade within Current Day.
for(j=OrdersTotal()-1;j>=0; j--) { if(OrderType()==OP_BUY) totalOrders++; // Check # of long trades. if(OrderType()==OP_SELL) totalOrders++; // Check # of short trades }
datetime today = StringToTime(TimeToString(TimeCurrent(),TIME_DATE)); int totalOrdersLong = 0, totalOrdersShort = 0; for(int y=OrdersHistoryTotal()-1;y>=0; y--) { if (OrderSelect(y,SELECT_BY_POS,MODE_HISTORY)) if (OrderCloseTime()>=today) { if (OrderType()==OP_BUY) totalOrdersLong++; if (OrderType()==OP_SELL) totalOrdersShort++; } } for(int y=OrdersTotal()-1;y>=0; y--) { if (OrderSelect(y,SELECT_BY_POS,MODE_TRADES)) if (OrderOpenTime()>=today) { if (OrderType()==OP_BUY) totalOrdersLong++; if (OrderType()==OP_SELL) totalOrdersShort++; } }
double profitSoFarLong=0,profitSoFarShort=0; for(int y=OrdersTotal()-1;y>=0; y--) { if (OrderSelect(y,SELECT_BY_POS,MODE_TRADES)) if (OrderOpenTime()>=today) { if (OrderType()==OP_BUY) { totalOrdersLong++; profitSoFarLong += OrderProfit()+OrderCommission()+OrderSwap(); } if (OrderType()==OP_SELL) { totalOrdersShort++; profitSoFarShort += OrderProfit()+OrderCommission()+OrderSwap(); } } }
然后你可以使用 profitSoFarLong 和 profitSoFarShort 来进一步控制
PS:如果你想获得总数(已关闭和已开启的订单),类似的代码也可以添加到已关闭的订单中)
嗨,Mladen。
非常感谢您的帮助!
我已经实现了这样的代码。
// Trades per Day and Profit Target
datetime today = StringToTime(TimeToString(TimeCurrent(),TIME_DATE)); int totalOrdersLong = 0, totalOrdersShort = 0; int x; for(x=OrdersHistoryTotal()-1;x>=0; x--) { if (OrderSelect(x,SELECT_BY_POS,MODE_HISTORY)) if (OrderCloseTime()>=today) { if (OrderType()==OP_BUY) totalOrdersLong++; if (OrderType()==OP_SELL) totalOrdersShort++; } } for(x=OrdersTotal()-1;x>=0; x--) { if (OrderSelect(x,SELECT_BY_POS,MODE_TRADES)) if (OrderOpenTime()>=today) { if (OrderType()==OP_BUY) totalOrdersLong++; if (OrderType()==OP_SELL) totalOrdersShort++; }
}
double profitSoFarLong=0,profitSoFarShort=0; for(x=OrdersTotal()-1;x>=0; x--) { if (OrderSelect(x,SELECT_BY_POS,MODE_TRADES)) if (OrderOpenTime()>=today) { if (OrderType()==OP_BUY) { totalOrdersLong++; profitSoFarLong += OrderProfit()+OrderCommission()+OrderSwap(); } if (OrderType()==OP_SELL) { totalOrdersShort++; profitSoFarShort += OrderProfit()+OrderCommission()+OrderSwap(); } } }
尊敬的专业编码人员。
我想在我的EA中实现 "每天四次交易/达到盈利目标时停止交易 "的功能。
如果达到最大的交易限额/利润,EA应该等到第二天再继续交易。
我想知道是否有人能审查我的代码,我在这里有点 "脑筋急转弯",所以代码
是一种伪代码状态...;-)
请先谢谢您!
extern int MaxShortTrades = 2;
extern int MaxLongTrades = 2;
extern double profitTarget = 300; // Target in Money
// Count Trades per Day.
int y;
int totalOrders = 4;
datetime toT; // Time of Trade
datetime doT; // Day of Trade
datetime now = TimeCurrent();
datetime boD=now-now%86400; // Beginning of day
if (AccountProfit()>= profitTarget)
{
for(y=0;y<totalOrders; y++)
{
if(OrderSelect(y,SELECT_BY_POS,MODE_HISTORY))
{
toT=OrderOpenTime(); // Time of Trade
doT=toT-toT%86400; // Day of Trade.
if(doT==boD)
{ // Time of Trade within Current Day.
for(j=OrdersTotal()-1;j>=0; j--)
{
if(OrderType()==OP_BUY) totalOrders++; // Check # of long trades.
if(OrderType()==OP_SELL) totalOrders++; // Check # of short trades
}
}
}
}
}
if(totalOrders<MaxLongTrades && Indicator_LONG_signal) Order=SIGNAL_BUY;
if(totalOrders<MaxShortTrades && Indicator_SHORT_signal) Order=SIGNAL_SELL;
为了同时检查历史订单(在当前日期关闭的订单)和已开立的订单,请尝试这样做。
int totalOrdersLong = 0, totalOrdersShort = 0;
for(int y=OrdersHistoryTotal()-1;y>=0; y--)
{
if (OrderSelect(y,SELECT_BY_POS,MODE_HISTORY))
if (OrderCloseTime()>=today)
{
if (OrderType()==OP_BUY) totalOrdersLong++;
if (OrderType()==OP_SELL) totalOrdersShort++;
}
}
for(int y=OrdersTotal()-1;y>=0; y--)
{
if (OrderSelect(y,SELECT_BY_POS,MODE_TRADES))
if (OrderOpenTime()>=today)
{
if (OrderType()==OP_BUY) totalOrdersLong++;
if (OrderType()==OP_SELL) totalOrdersShort++;
}
}
if(totalOrdersLong <MaxLongTrades && Indicator_LONG_signal) Order=SIGNAL_BUY;
if(totalOrdersShort<MaxShortTrades && Indicator_SHORT_signal) Order=SIGNAL_SELL;
嗨,Mladen。
非常感谢您的帮助,现在我对如何处理这个问题已经比较清楚了。
是否也可以检查一下"每日盈利目标"? 假设该EA每天的盈利为50.欧元。
如果达到每天的目标,它将停止交易,并在第二天继续....。
大概是这样的。
if (AccountProfit()<= profitTarget)
{
datetime today = StringToTime(TimeToString(TimeCurrent(),TIME_DATE));
int totalOrdersLong = 0, totalOrdersShort = 0;
for(int y=OrdersHistoryTotal()-1;y>=0; y--)
{
if (OrderSelect(y,SELECT_BY_POS,MODE_HISTORY))
if (OrderCloseTime()>=today)
{
if (OrderType()==OP_BUY) totalOrdersLong++;
if (OrderType()==OP_SELL) totalOrdersShort++;
}
}
for(int y=OrdersTotal()-1;y>=0; y--)
{
if (OrderSelect(y,SELECT_BY_POS,MODE_TRADES))
if (OrderOpenTime()>=today)
{
if (OrderType()==OP_BUY) totalOrdersLong++;
if (OrderType()==OP_SELL) totalOrdersShort++;
}
}
if(totalOrdersLong <MaxLongTrades && Indicator_LONG_signal) Order=SIGNAL_BUY;
if(totalOrdersShort<MaxShortTrades && Indicator_SHORT_signal) Order=SIGNAL_SELL;
}
// Check if Profit Targer for the day is reached, so close all open Opsitions
if (AccountProfit()>= profitTarget)
{
if(OrderSelect(buy_ticket,SELECT_BY_TICKET))
{
dummyResult=OrderClose(OrderTicket(),OrderLots(),Bid,Slippage*PipMultiplier,MediumSeaGreen);
Print("Error closing Buy #",(string)OrderTicket()," Error code ",(string)GetLastError());
}
}
else
if(Order==SIGNAL_CLOSESELL && sell_ticket!=0)
{
if(OrderSelect(sell_ticket,SELECT_BY_TICKET))
{
dummyResult=OrderClose(OrderTicket(),OrderLots(),Ask,Slippage*PipMultiplier,DarkOrange);
Print("Error closing Sell #",(string)OrderTicket()," Error code ",(string)GetLastError());
}
}
嗨,Mladen。
非常感谢您的帮助,现在对如何处理这个问题已经比较清楚了。
是否也可以检查一下 "每日盈利目标"? 假设EA每天的盈利是50.欧元。
如果达到每天的目标,它将停止交易,并在第二天继续....。
大概是这样的。
if (AccountProfit()<= profitTarget)
{
datetime today = StringToTime(TimeToString(TimeCurrent(),TIME_DATE));
int totalOrdersLong = 0, totalOrdersShort = 0;
for(int y=OrdersHistoryTotal()-1;y>=0; y--)
{
if (OrderSelect(y,SELECT_BY_POS,MODE_HISTORY))
if (OrderCloseTime()>=today)
{
if (OrderType()==OP_BUY) totalOrdersLong++;
if (OrderType()==OP_SELL) totalOrdersShort++;
}
}
for(int y=OrdersTotal()-1;y>=0; y--)
{
if (OrderSelect(y,SELECT_BY_POS,MODE_TRADES))
if (OrderOpenTime()>=today)
{
if (OrderType()==OP_BUY) totalOrdersLong++;
if (OrderType()==OP_SELL) totalOrdersShort++;
}
}
if(totalOrdersLong <MaxLongTrades && Indicator_LONG_signal) Order=SIGNAL_BUY;
if(totalOrdersShort<MaxShortTrades && Indicator_SHORT_signal) Order=SIGNAL_SELL;
}
// Check if Profit Targer for the day is reached, so close all open Opsitions
if (AccountProfit()>= profitTarget)
{
if(OrderSelect(buy_ticket,SELECT_BY_TICKET))
{
dummyResult=OrderClose(OrderTicket(),OrderLots(),Bid,Slippage*PipMultiplier,MediumSeaGreen);
Print("Error closing Buy #",(string)OrderTicket()," Error code ",(string)GetLastError());
}
}
else
if(Order==SIGNAL_CLOSESELL && sell_ticket!=0)
{
if(OrderSelect(sell_ticket,SELECT_BY_TICKET))
{
dummyResult=OrderClose(OrderTicket(),OrderLots(),Ask,Slippage*PipMultiplier,DarkOrange);
Print("Error closing Sell #",(string)OrderTicket()," Error code ",(string)GetLastError());
}
}
你为什么不在检查 当前打开的多头和空头订单的循环中添加一些利润收集(求和)的功能呢?
像这样的东西。
double profitSoFarLong=0,profitSoFarShort=0;
for(int y=OrdersTotal()-1;y>=0; y--)
{
if (OrderSelect(y,SELECT_BY_POS,MODE_TRADES))
if (OrderOpenTime()>=today)
{
if (OrderType()==OP_BUY) { totalOrdersLong++; profitSoFarLong += OrderProfit()+OrderCommission()+OrderSwap(); }
if (OrderType()==OP_SELL) { totalOrdersShort++; profitSoFarShort += OrderProfit()+OrderCommission()+OrderSwap(); }
}
}
然后你可以使用 profitSoFarLong 和 profitSoFarShort 来进一步控制。
PS:如果你想得到总数(对于已关闭和已开启的订单),类似的代码也可以添加到已关闭的订单中)
嗨,姆拉登。
你已经为我修复了 "AutoFiboAutoTrend "指标,它运行良好。当菲波的方向从 "向上 "变为 "向下 "时,是否可以增加一个音频警报的通知?请看图片1和2
谢谢你,Lea
你为什么不在检查当前开仓的多头和空头订单的循环中加入一些利润收集(求和)的内容呢?
像这样的:
double profitSoFarLong=0,profitSoFarShort=0;
for(int y=OrdersTotal()-1;y>=0; y--)
{
if (OrderSelect(y,SELECT_BY_POS,MODE_TRADES))
if (OrderOpenTime()>=today)
{
if (OrderType()==OP_BUY) { totalOrdersLong++; profitSoFarLong += OrderProfit()+OrderCommission()+OrderSwap(); }
if (OrderType()==OP_SELL) { totalOrdersShort++; profitSoFarShort += OrderProfit()+OrderCommission()+OrderSwap(); }
}
}
然后你可以使用 profitSoFarLong 和 profitSoFarShort 来进一步控制
PS:如果你想获得总数(已关闭和已开启的订单),类似的代码也可以添加到已关闭的订单中)
嗨,Mladen。
非常感谢您的帮助!
我已经实现了这样的代码。
datetime today = StringToTime(TimeToString(TimeCurrent(),TIME_DATE));
int totalOrdersLong = 0, totalOrdersShort = 0;
int x;
for(x=OrdersHistoryTotal()-1;x>=0; x--)
{
if (OrderSelect(x,SELECT_BY_POS,MODE_HISTORY))
if (OrderCloseTime()>=today)
{
if (OrderType()==OP_BUY) totalOrdersLong++;
if (OrderType()==OP_SELL) totalOrdersShort++;
}
}
for(x=OrdersTotal()-1;x>=0; x--)
{
if (OrderSelect(x,SELECT_BY_POS,MODE_TRADES))
if (OrderOpenTime()>=today)
{
if (OrderType()==OP_BUY) totalOrdersLong++;
if (OrderType()==OP_SELL) totalOrdersShort++;
}
}
double profitSoFarLong=0,profitSoFarShort=0;
for(x=OrdersTotal()-1;x>=0; x--)
{
if (OrderSelect(x,SELECT_BY_POS,MODE_TRADES))
if (OrderOpenTime()>=today)
{
if (OrderType()==OP_BUY) { totalOrdersLong++; profitSoFarLong += OrderProfit()+OrderCommission()+OrderSwap(); }
if (OrderType()==OP_SELL) { totalOrdersShort++; profitSoFarShort += OrderProfit()+OrderCommission()+OrderSwap(); }
}
}
// EA STOP if Profit is Reached.
if (profitSoFarLong>50 || profitSoFarLong>50)
{
if(OrderType()==OP_BUY) { dummyResult = OrderClose(OrderTicket(),OrderLots(),MarketInfo(s_symbol,MODE_ASK),0,CLR_NONE); }
if(OrderType()==OP_SELL) { dummyResult = OrderClose(OrderTicket(),OrderLots(),MarketInfo(s_symbol,MODE_BID),0,CLR_NONE); }
Print ("Account Profit Reached. All Open Trades Have Been Closed");
return(0);
Sleep(3600); // one hour
}
请帮助我mladen。SLIPPAGE在所附的EA中不起作用
拉吉夫
Slippage在OrderSend()调用 中处于正确的位置--尝试使用一些更大的值,然后进行测试,因为它的代码用法是确定的。
请帮助我...是否可以将每次 "收盘 "与所有的输出 手段
,在代码中这个指标
。
void RSI_output(string SymbolName,int PeriodMinutes)
{
int size=iBars(SymbolName,PeriodMinutes); if(size==0) return;
int handle=FileOpen(SymbolName+PeriodMinutes+"_RSI.csv",FILE_WRITE|FILE_CSV); if (handle<0)return;
FileWrite(handle,"Time seconds;Time;Open;Low;High;Close;Volume;RSI");
for (int i=size-1;i>=0;i--)
{
FileWrite(handle,iTime(SymbolName,PeriodMinutes,i),TimeToStr(iTime(SymbolName,PeriodMinutes,i))
,iOpen(SymbolName,PeriodMinutes,i),iLow(SymbolName,PeriodMinutes,i),iHigh(SymbolName,PeriodMinutes,i)
,iClose(SymbolName,PeriodMinutes,i),iVolume(SymbolName,PeriodMinutes,i),iCustom(SymbolName,PeriodMinutes,"RSI",0,i));
}
FileClose(handle);
return;
}
int start() { RSI_output(_Symbol,_Period); return(0); }
我想把每一次 "收盘 "保存到.csv文件中,不需要盘旋和再次更新文件。只是在一行中完成一个文件。每分钟,例如)))))))求你了,求你了。给我提供与R互动的工作仪器。
请帮助我...是否可以将每一次 "收盘 "都写到.csv文件中,并采用所有的导出方式?
在代码中,这个指标
void RSI_output(string SymbolName,int PeriodMinutes)
{
int size=iBars(SymbolName,PeriodMinutes); if(size==0) return;
int handle=FileOpen(SymbolName+PeriodMinutes+"_RSI.csv",FILE_WRITE|FILE_CSV); if (handle<0)return;
FileWrite(handle,"Time seconds;Time;Open;Low;High;Close;Volume;RSI");
for (int i=size-1;i>=0;i--)
{
FileWrite(handle,iTime(SymbolName,PeriodMinutes,i),TimeToStr(iTime(SymbolName,PeriodMinutes,i))
,iOpen(SymbolName,PeriodMinutes,i),iLow(SymbolName,PeriodMinutes,i),iHigh(SymbolName,PeriodMinutes,i)
,iClose(SymbolName,PeriodMinutes,i),iVolume(SymbolName,PeriodMinutes,i),iCustom(SymbolName,PeriodMinutes,"RSI",0,i));
}
FileClose(handle);
return;
}
int start() { RSI_output(_Symbol,_Period); return(0); }
我想在每次 "关闭 "时保存到.csv文件中,不需要盘旋,并再次更新文件。只是在一行中完成一个文件。每分钟,例如)))))))求你了,求你了。给我提供与R互动的工作仪器。
是的,时间表上的历史内容+1条(及我的iCustom指标)。只要求不永远重写文件。
这里有一个版本,它有一个选项--它应该重写旧的数据文件,还是应该总是为每个新的柱子创建一个新的文件
#property indicator_buffers 0
extern bool RewriteOldData=true;
void RSI_output(string symbolName,int PeriodMinutes, datetime time)
{
string name = (RewriteOldData) ? symbolName+PeriodMinutes : symbolName+PeriodMinutes+(string)(time/60);
int size =iBars(symbolName,PeriodMinutes); if(size==0) return;
int handle=FileOpen(name+"_RSI.csv",FILE_WRITE|FILE_CSV); if (handle<0)return;
FileWrite(handle,"Time seconds;Time;Open;Low;High;Close;Volume;RSI");
for (int i=size-1;i>=0;i--)
FileWrite(handle,iTime(symbolName,PeriodMinutes,i),TimeToStr(iTime(symbolName,PeriodMinutes,i))
,iOpen(symbolName,PeriodMinutes,i),iLow(symbolName,PeriodMinutes,i),iHigh(symbolName,PeriodMinutes,i)
,iClose(symbolName,PeriodMinutes,i),iVolume(symbolName,PeriodMinutes,i),iCustom(symbolName,PeriodMinutes,"RSI",0,i));
FileFlush(handle);
FileClose(handle);
return;
}
int start()
{
static datetime lastTime=0;
if (lastTime!=Time[0]) RSI_output(_Symbol,_Period,Time[0]);
lastTime= Time[0];
return(0);
}
这是一个指标,你所要做的就是设置RewriteOldData参数,让它工作。