In next stage i open this file and look into history for dates of opened orders then i check results of this trades and write into file "sellResults.tab"+indicators values writen in previous stage(above) .And here problem occures, only one same trade is recorded:
似乎从来没有人帮助过我,请回答 。
通过适度的猜测,我认为问题出在指标上,或者你对它的扩展,而不是你对iCustom的使用。也许将缓冲区2和3与警报一起分配会更好?(尽管我不知道如何/何时分配它们的索引零([0])值。)
价格数据信息
我的出场和进场是基于信号在下一个柱状体的开盘时产生的条件(进场和出场),我是否应该使用开盘价来做指标和移动平均线?我一直使用日终数据进行股票交易,所以自然而然地,我就倾向于使用日终数据。外界的共识是什么?
只是在想
你如何在货币对的最低止损水平 上设置追踪止损,因此如果止损水平是4点或25点,那么根据货币对的情况,追踪止损将在这个水平上启动。
我应该说,你是如何使用每个货币对的合约规格的。
谢谢
贝诺
Sidus_Bago指标
你好,增加。
我想知道你是否可以帮助我将Sidus_Bago编码为MTF指标。我认为这个指标也很好。
Sidus_Bago在这里。
Sidus系统确认 "指标?
非常感谢你。
谁能帮我解决这个EA?
大家好。
我对我的第一个EA进行了尝试,但它无法编译;我得到一个错误"'程序结束'--左括号不平衡",我已经看了几遍,但找不到问题所在。 不要担心交易策略的逻辑(除非你热衷于此),一旦编译和运行,我就会着手解决这个问题......
显然,我没有权限附加文件,所以对剪切和粘贴也感到抱歉。
谢谢。
罗伯。
珀斯,澳大利亚
//---------------
//+------------------------------------------------------------------+
//| 罗伯-考辛斯|罗伯-考辛斯|Rob_Ea.mq4
罗伯-考辛斯 | //| 罗伯-考辛斯
//| |
//+------------------------------------------------------------------+
#财产版权 "Rob Cousins"
#property link ""
#define MAGICMA 20090216
//---- 输入参数
extern double Lots;
extern int Short_MA=5;
extern int Long_MA=15;
extern double Stoch_Upper=70.0;
extern double Stoch_Lower=30.0;
外部双倍RSI_Upper=80.0。
extern double RSI_Lower=20.0;
//+------------------------------------------------------------------+
//|专家初始化函数|
//+------------------------------------------------------------------+
int init()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//|专家的去初始化功能|
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
string Current_Indication()
{
// 移动平均数的变量
double MA_Short;
double MA_Long;
string Current_MA_Indicator;
string Previous_MA_Indicator;
string MA_Indicator;
// 随机变量
string Current_Stoch_Indicator;
string Previous_Stoch_Indicator;
string Stoch_Indicator;
// RSI变量
string Current_RSI_Indicator;
string Previous_RSI_Indicator;
string RSI_Indicator;
// --------------------------------------
// 首先得到MAs,并检查MA交叉点
// --------------------------------------
MA_Short=iMA(NULL,0,Short_MA,0,1,PRICE_MEDIAN,0)。
MA_Long=iMA(NULL,0,Long_MA,0,0,PRICE_MEDIAN,0)。
如果(MA_Short>MA_Long) Current_MA_Indicator="BUY";
如果 (MA_Short<MA_Long) Current_MA_Indicator="SELL";
//使用移位的MA(选项中的最后一个'1')设置前值和现值
if (iMA(NULL,0,Short_MA,0,1,PRICE_MEDIAN,1)>iMA(NULL,0,Long_MA,0,0,PRICE_MEDIAN,1))Previous_MA_Indicator="BUY"。
如果(iMA(NULL,0,Short_MA,0,1,PRICE_MEDIAN,1)<iMA(NULL,0,Long_MA,0,0,PRICE_MEDIAN,1))Previous_MA_Indicator="SELL";
如果((Current_MA_Indicator=="BUY") && (Previous_MA_Indicator=="BUY"))MA_Indicator="BUY"。
如果((Current_MA_Indicator=="SELL") && (Previous_MA_Indicator=="SELL"))MA_Indicator="SELL"。
// ----------------------------
// 随机指标检查
// ----------------------------
if(iStochastic(NULL,0,6,3,3,MODE_SMA,0,MODE_MAIN,0)>Stoch_Upper) Current_Stoch_Indicator="BUY";
if(iStochastic(NULL,0,6,3,3,MODE_SMA,0,MODE_MAIN,0)<Stoch_Lower) Current_Stoch_Indicator="SELL";
if(iStochastic(NULL,0,6,3,3,MODE_SMA,0,MODE_MAIN,1)>Stoch_Upper) Previous_Stoch_Indicator="BUY";
如果(iStochastic(NULL,0,6,3,3,MODE_SMA,0,MODE_MAIN,1)<Stoch_Lower) Previous_Stoch_Indicator="SELL";
如果((Current_Stoch_Indicator=="BUY") && (Previous_Stoch_Indicator=="BUY"))Stoch_Indicator="BUY";
如果((Current_Stoch_Indicator=="SELL") && (Previous_Stoch_Indicator=="SELL"))Stoch_Indicator="SELL"。
// ----------------------------
// RSI指标检查
// ----------------------------
if(iRSI(NULL,0,3,PRICE_CLOSE,0)>RSI_Upper) Current_RSI_Indicator="BUY";
如果(iRSI(NULL,0,3,PRICE_CLOSE,0)<RSI_Lower) Current_RSI_Indicator="SELL";
如果(iRSI(NULL,0,3,PRICE_CLOSE,1)>RSI_Upper) Previous_RSI_Indicator="BUY";
如果(iRSI(NULL,0,3,PRICE_CLOSE,1)<RSI_Lower) Previous_RSI_Indicator="SELL";
如果((Current_RSI_Indicator=="BUY") && (Previous_RSI_Indicator=="BUY"))RSI_Indicator="BUY"。
如果((Current_RSI_Indicator=="SELL") && (Previous_RSI_Indicator=="SELL"))RSI_Indicator="卖出"。
//----------------------------------------
//弄清楚你是处于买入还是卖出的情况下
//----------------------------------------
if((MA_Indicator=="BUY") && (Stoch_Indicator=="BUY") && (RSI_Indicator=="BUY") return("BUY");
if((MA_Indicator=="SELL") && (Stoch_Indicator=="SELL") && (RSI_Indicator=="SELL") return("SELL");
}
//+------------------------------------------------------------------+
//| 计算未结头寸 |
//+------------------------------------------------------------------+
string Current_Trade(string symbol)
{
//----
for(int i=0;i<OrdersTotal();i++)
{
如果(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)
{
返回("NONE")。
break;
}
如果(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
{
如果(OrderType()==OP_BUY) 返回("BUY")。
如果(OrderType()==OP_SELL) 返回("SELL")。
}
}
}
//----------------------------------------------------------------------
// 如果信号改变了方向,首先要做的是关闭
// 当前已开的交易,然后再开另一个。
//-----------------------------------------------------------------------
void CloseTrade(string symbol)
{
//双马。
//----,只在新条形图的第一个时间段进行交易。
// if(Volume[0]>1) return;
//----
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; // 没有未完成的交易
如果(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) 继续。
//---- 检查订单类型
//暂时保留这两个选项,以防我想用不同的方式来做。
//比如有不同的颜色,或者其他什么。 否则这两个命令是一样的
// 你只需要一个。 除了不同的价格,我想... Doh!
如果(OrderType()==OP_BUY)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,White)。
休息。
}
如果(OrderType()==OP_SELL)
{
OrderClose(OrderTicket(), OrderLots(),Ask,3,White)。
break;
}
}
//----
}
//-----------------------------------------------------------
// 如果茶叶是这么说的,就开个仓吧
//------------------------------------------------------------
空白OpenTrade(string symbol,string Type)
{
int res;
//---- 买入条件
if(Type=="BUY") OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0, "ROB EA TEST",MAGICMA,0,Blue);
//---- 卖出条件
if(Type=="SELL") OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0, "ROB EA TEST",MAGICMA,0,Red);
}
//+------------------------------------------------------------------+
//|专家启动功能|
//+------------------------------------------------------------------+
空白启动()
{
//----
//---- 按当前符号计算未结订单
if(Current_Trade(Symbol())=="NONE") OpenTrade(Symbol(),Current_Indication() )。
// 但是如果有一个未平仓的交易,我们需要在打开新的交易之前先关闭它。
如果((Current_Trade(Symbol())=="BUY") && (Current_Indication()=="SELL"))。
{
CloseTrade(Symbol())。
OpenTrade(Symbol(),Current_Indication())。
}
如果((Current_Trade(Symbol())=="SELL") && (Current_Indication()=="BUY"))。
{
CloseTrade(Symbol())。
OpenTrade(Symbol(),Current_Indication())。
}
返回。
}
你去那里.........................................
好的,真快! 非常感谢。 问题出在哪里?
罗伯。
写入文件的问题
我正在编写EA,它使用文件来保存交易结果(损失,胜利)和指标值。因此,当EA进入交易时,我将指标值和交易时间写入文件 "sellOpenInd.tab"。
在此操作后,文件包括。
CCISDivPresent 22 69 0.000024 0.000046 0.000045 -0.000015 2002.05.07 13:00
CCISDivPresent 66 85 0.000064 0.000032 0.000037 -0.000033 2002.05.15 07:00
CCISDivPresent 77 90 0.000041 -0.000029 0.000008 -0.000020 2002.06.03 08:00
etc...
In next stage i open this file and look into history for dates of opened orders then i check results of this trades and write into file "sellResults.tab"+indicators values writen in previous stage(above) .And here problem occures, only one same trade is recorded:
Rule7 Rule6 Rule5 Rule4 Rule3 Rule2 Rule1 TradeOutcome
-0.000015 0.000045 0.000046 0.000024 69 22 CCISDivPresent win
-0.000015 0.000045 0.000046 0.000024 69 22 CCISDivPresent win
-0.000015 0.000045 0.000046 0.000024 69 22 CCISDivPresent win
etc..
Here is my code(i know is not looking nice ):
int dates=FileOpen("sellOpenInd.tab", FILE_CSV|FILE_READ,"\t");
if(dates>0){
for(k=0;k<=10;k++){ //i use for loop instead of while(!FileIsEnding(dates) ) because ea enters in infinite loop for unknown reasons
dates=FileOpen("sellOpenInd.tab", FILE_CSV|FILE_READ,"\t");
FileSeek(dates,filepos,SEEK_SET);
while (FileIsLineEnding(dates)==FALSE){filestr=FileReadString(dates)+"\t"+filestr;filepos=filepos+FileTell(dates);}
decodeFile(filestr);//calling function which decodes readed string line, then writing results to global varaiables filter7 ,filter6 etc.
Comment(filterS7);
for (i =OrdersHistoryTotal()-1; i>=0; i--) {
OrderSelect(i, SELECT_BY_POS, MODE_HISTORY);
if (OrderSymbol() == Currencies) {
if((OrderMagicNumber()==16381||OrderMagicNumber()==16383)&&OrderCloseTime()!=0){
historyDateTime=TimeToStr(OrderOpenTime());
OrderP=OrderProfit();
if(OrderP>0)orderresult="win";if(OrderP<=0)orderresult="loss";
if(filterS7==historyDateTime) {
testFline=filterS6+"\t"+filterS5+"\t"+filterS4+"\t"+filterS3+"\t"+filterS2+"\t"+filterS1+"\t"+filterS0+"\t"+orderresult;
results=FileOpen("sellResults.tab", FILE_READ|FILE_WRITE,"\t");
FileSeek(results,0,SEEK_END);
FileWrite(results,testFline);
testFline="";
filestr="";
}
}
}
}
if(!FileIsEnding(dates)){FileClose(dates);FileClose(results);filepos=0;break;
}
}
}
在你的程序中,每一步你都反复打开"sellOpenInd.tab "文件。
试试这个。
if(dates>0){
for(k=0;k<=10;k++){ //i use for loop instead of while(!FileIsEnding(dates) ) because ea enters in infinite loop for unknown reasons
FileSeek(dates,filepos,SEEK_SET);
while (FileIsLineEnding(dates)==FALSE){filestr=FileReadString(dates)+"\t"+filestr;filepos=filepos+FileTell(dates);}
decodeFile(filestr);//calling function which decodes readed string line, then writing results to global varaiables filter7 ,filter6 etc.
Comment(filterS7);
for (i =OrdersHistoryTotal()-1; i>=0; i--) {
OrderSelect(i, SELECT_BY_POS, MODE_HISTORY);
if (OrderSymbol() == Currencies) {
if((OrderMagicNumber()==16381||OrderMagicNumber()==16383)&&OrderCloseTime()!=0){
historyDateTime=TimeToStr(OrderOpenTime());
OrderP=OrderProfit();
if(OrderP>0)orderresult="win";if(OrderP<=0)orderresult="loss";
if(filterS7==historyDateTime) {
testFline=filterS6+"\t"+filterS5+"\t"+filterS4+"\t"+filterS3+"\t"+filterS2+"\t"+filterS1+"\t"+filterS0+"\t"+orderresult;
results=FileOpen("sellResults.tab", FILE_READ|FILE_WRITE,"\t");
FileSeek(results,0,SEEK_END);
FileWrite(results,testFline);
testFline="";
filestr="";
}
}
}
}
if(!FileIsEnding(dates)){FileClose(dates);FileClose(results);filepos=0;break;
}
}
}嗨,Roger09,我以前也试过这样做,但没有什么用。
总之,谢谢你的回答。