// Простой параболик. Переворотная стратегия.// В условиях, когда в терминале уже есть открытые позиции по другим инструментам.inputdouble TakeProfit =2500;
inputdouble StopLoss =400;
inputdouble Lots =1;
inputdouble TrailingStop =100;
inputdouble Parameter1 =0.02; // Параметры индикатора PSARinputdouble Parameter2 =0.2;
voidOnTick()
{
int position_exists; // Переменная, принимающая значения 0 или 1. Указывает, открыта ли позиция по интструменту EURUSD// Занесение в переменные значений индикатора на последнем и предпоследнем закрывшихся барах double SAR_Prev=iSAR(NULL,0,Parameter1,Parameter2,1);
double SAR_Prev2=iSAR(NULL,0,Parameter1,Parameter2,2);
// Занесение в переменные цен закрытия на последнем и предпоследнем барахdouble LastClose=iClose(NULL,0,1);
double LastClose2=iClose(NULL,0,2);
//--------------------------------------------------------------------- // Блок, который определяет, открыта ли позиция по инструменту EURUSD// путём перебора всех открытых ордеров терминала в цикле. // Если позиция открыта, то переменной position_exists будет присвоено значение 1int cnt;
string sym;
int type;
int total=OrdersTotal();
position_exists=0;
for (cnt=0; cnt<=total-1; cnt++)
{
bool select=OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
sym=OrderSymbol();
type=OrderType();
if (sym=="EURUSD" && (type==1 || type==0))
{
position_exists=1;
break;
}
}
//--------------------------------------------------------------------- // Если позиция по EURUSD не существует, то проверяем условия открытия сделки if(position_exists==0)
{
if (SAR_Prev<LastClose && SAR_Prev2>LastClose2)
{
int ticket_buy=OrderSend(Symbol(),OP_BUY,Lots,Ask,0,Bid-StopLoss*Point,Ask+TakeProfit*Point," ",111,0,Blue);
Alert ("Присвоили значение пременной ticket_buy ", ticket_buy);
return;
}
if (SAR_Prev>LastClose && SAR_Prev2<LastClose2)
{
int ticket_sell=OrderSend(Symbol(),OP_SELL,Lots,Bid,0,Ask+StopLoss*Point,Bid-TakeProfit*Point," ",111,0,Red);
Alert ("Присвоили значение пременной ticket_sell ", ticket_sell);
return;
}
}
Alert ("Существование позиции = ", position_exists, " Ордер на покупку ", ticket_buy, " Ордер на продажу ", ticket_sell);
//--------------------------------------------------------------------- // Если позиция по EURUSD существует, то проверяем условия закрытия позиции if (position_exists==1)
{
if (ticket_sell==0) // Если открытой позиции на продажу нет, то выбираем открытый ордер на покупку по тикету
{bool select_buy=OrderSelect(ticket_buy,SELECT_BY_TICKET,MODE_TRADES);}
if (ticket_buy==0) // Если открытой позиции на покупку нет, то выбираем открытый ордер на продажу по тикету
{bool select_sell=OrderSelect(ticket_sell,SELECT_BY_TICKET,MODE_TRADES);}
if(OrderType()==OP_BUY)
{
if(SAR_Prev>LastClose && SAR_Prev2<LastClose2) // Проверяем уловия для закрытия длинной позиции
{
bool close_buy=OrderClose(OrderTicket(),OrderLots(),Bid,0,Violet);
return;
}
}
if(OrderType()==OP_SELL)
{
if(SAR_Prev<LastClose && SAR_Prev2>LastClose2) // Проверяем уловия для закрытия короткой позиции
{
bool close_sell=OrderClose(OrderTicket(),OrderLots(),Ask,0,Violet);
return;
}
}
}
}
我没有使用过这个功能。其假设是,如果终端选择了一个字符一次,下一次尝试选择相同的字符可能会返回错误。试着忽略这个函数的返回检查。
事实证明,SymbolSelect("AUDUSD", true)只有在AUDUSD不在MarketWatch中时才会返回true--也就是说,当该货币对被添加到MarketWatch中。一旦该货币对进入MarketWatch,后续调用将返回false。
这种行为与该函数的手册完全不一致。
我不得不使用一个自己编写的函数,扫描所有的SymbolName(i, true) 为i=0...SymbolsTotal(true)。
事实证明,SymbolSelect("AUDUSD", true)只有在AUDUSD不在MarketWatch中时才会返回true--也就是说,当该货币对被添加到MarketWatch中。一旦该货币对进入MarketWatch,后续调用将返回false。
这种行为与该函数的手册完全不一致。
直觉告诉我,你可以不使用SymbolSelect()。
是的,刚刚更新了我上面的帖子
另一个是什么,或者我们是否应该在这个问题上已经做了一个腿部的准备?
掌握外汇
我花了4个月的时间在Alpari.....,做了一个猫头鹰。nano quanto代码非常他妈的耗时,而且不小.....,现在一切都!!!!!。遗憾的是....我不知道该怎么做。
第三次猫头鹰,还是同样的错误,很高兴问题不在代码上:)
掌握外汇
谢谢,我会看看的
谢谢,我会看看的
不是竞选,只是回答了一个问题 :)
大家好。我不久前开始写EA。我遇到了一个看似简单的问题,但我无法解决。 请帮助我。
问题是。在一个新的刻度上,我失去了一个变量的值。
简要描述。将OrderSend()函数的返回值分配给某个变量,并使用返回命令退出。 在下一次打勾时,变量值变为等于零。
源代码的关键因素。下面是完整的源代码。
如果(SAR_Prev>LastClose &&SAR_Prev2<LastClose2)
{
int ticket_sell=OrderSend(Symbol(,OP_SELL,Lots,Bid,0,Ask+StopLoss*Point,Bid-TakeProfit*Point,",111,0,Red)。
Alert ("Assigned value to ticket_sell variable ", ticket_sell);
返回。
}
}
提醒("存在的位置=", position_exists, "买单", ticket_buy, "卖单", ticket_sell)。
结果。
截图显示仓位被成功打开,订单票被记忆在ticket_sell变量中。然而,ticket_sell变量在下一个tick上变为零。而且我不能修改/删除票据上的订单。
大家好。我不久前开始写EA。我遇到了一个看似简单的问题,但我无法解决。 请帮助我。
问题是。在一个新的刻度上,我失去了一个变量的值。
简要描述。将OrderSend()函数的返回值分配给某个变量,并使用返回命令退出。 在下一次打勾时,变量值变为等于零。
源代码的关键因素。下面是完整的源代码。
如果(SAR_Prev>LastClose &&SAR_Prev2<LastClose2)
{
int ticket_sell=OrderSend(Symbol(,OP_SELL,Lots,Bid,0,Ask+StopLoss*Point,Bid-TakeProfit*Point,",111,0,Red)。
Alert ("Assigned value to ticket_sell variable ", ticket_sell);
返回。
}
}
提醒("存在的位置=", position_exists, "买单", ticket_buy, "卖单", ticket_sell)。
结果。
截图显示仓位被成功打开,订单票被记忆在ticket_sell变量中。然而,ticket_sell变量在下一个tick上变为零。而且我不能修改/删除票据上的订单。
为了避免丢失价值,我们需要一个全局变量,把它的声明放在OnTick() 之外,或者把它变成静态的