//+------------------------------------------------------------------+//| подготовить массив тикетов для закрытия |//+------------------------------------------------------------------+void PrepareTicketsToClose(int signal, bool Revers, int & ticketsClose[][2], double & lots[],double arrayTickets[][9])
{
int size=ArrayRange(arrayTickets,0);
//----if (size==0) return;
int i,type,ticket,closeSize;
for (i=0;i<size;i++)
{
type=arrayTickets[i][1];
// если тип ордера не рыночный, то пропускаемif (type>OP_SELL) continue;
if (Revers) // перевернем тип рыночного ордера
{
if (type==OP_BUY) type=OP_SELL; else type=OP_BUY;
}
// тут решаем для каждого открытого ордера его судьбу// оставить в рынке или добавить в массив на закрытиеif (type==OP_BUY)
{
//// код разрешающий оставить покупку// как примерif (signal==OP_BUY) continue;
}
if (type==OP_SELL)
{
//// код разрешающий оставить продажу// как примерif (signal==OP_SELL) continue;
}
closeSize=ArrayRange(ticketsClose,0);
ArrayResize(ticketsClose,closeSize+1);
ArrayResize(lots,closeSize+1);
ticketsClose[closeSize][0] = arrayTickets[i][0]; // # тикета
ticketsClose[closeSize][1] = arrayTickets[i][1]; // тип ордера// здесь укажем сколько лотов нужно закрыть
lots[closeSize] = arrayTickets[i][2]; // закрываемый объем// можно закрывать частично, тогда нужно переписать строку сверху
}
//----return;
}
//+------------------------------------------------------------------+//| Закрывает ордера с указанными тикетами |//+------------------------------------------------------------------+void CloseMarketOrders(int ticketsArray[][2], double lotsArray[])
{
//----int i,size=ArrayRange(ticketsArray,0);
if (size==0) return;
int ticket,type;
double lots;
bool res;
int total=OrdersTotal();
for (i=0;i<size;i++)
{
ticket = ticketsArray[i][0];
type = ticketsArray[i][1];
lots = lotsArray[i];
RefreshRates(); // на всякий случай обновим сведения о рыночном окружении// блок закрытия покупокif (type==OP_BUY)
{
res = OrderClose(ticket,lots,Bid,Slippage,Orange);
if (!res)
{
Print("Не удалось закрыть ордер в покупку #",ticket,"! Ошибка №",GetLastError());
// дальнейшая обработка ошибки, написать самостоятельно
}
}
// блок закрытия продажif (type==OP_SELL)
{
res = OrderClose(ticket,lots,Ask,Slippage,Orange);
if (!res)
{
Print("Не удалось закрыть ордер в продажу #",ticket,"! Ошибка №",GetLastError());
// дальнейшая обработка ошибки, написать самостоятельно
}
}
}
//----return;
}
//========================================================================================================================// Закрытие открытых позиций на продажу //-------------------------------------------------------------------------------------------------------------------------if(ExistPositions(NULL, OP_SELL, Magic, 0) == true) //если открыта позиция sell
{
if() // условие на закритие
{
ClosePosFirstProfit(NULL, OP_SELL, Magic); //закрываем позицию
}
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 06.03.2008 |//| Описание : Возвращает флаг существования позиций |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" - любой символ, |//| NULL - текущий символ) |//| op - операция (-1 - любая позиция) |//| mn - MagicNumber (-1 - любой магик) |//| ot - время открытия ( 0 - любое время открытия) |//+----------------------------------------------------------------------------+bool ExistPositions(string sy="", int op=-1, int mn=-1, datetime ot=0) {
int i, k=OrdersTotal();
if (sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol()==sy || sy=="") {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
if (mn<0 || OrderMagicNumber()==mn) {
if (ot<=OrderOpenTime()) return(True);
}
}
}
}
}
}
return(False);
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 19.02.2008 |//| Описание: Закрытие одной предварительно выбранной позиции |//+----------------------------------------------------------------------------+void ClosePosBySelect() {
bool fc;
color clClose;
double ll, pa, pb, pp;
int dg=MarketInfo(OrderSymbol(), MODE_DIGITS), err, it;
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
for (it=1; it<=NumberOfTry; it++) {
if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) //break;while (!IsTradeAllowed()) Sleep(5000);
RefreshRates();
pa=MarketInfo(OrderSymbol(), MODE_ASK);
pb=MarketInfo(OrderSymbol(), MODE_BID);
if (OrderType()==OP_BUY) {
pp=pb; clClose=clCloseBuy;
} else {
pp=pa; clClose=clCloseSell;
}
ll=OrderLots();
pp=NormalizeDouble(pp, dg);
fc=OrderClose(OrderTicket(), ll, pp, Slippage, clClose);
if (fc) {
if (UseSound) PlaySound(SoundSuccess); //break;
} else {
err=GetLastError();
if (UseSound) PlaySound(SoundError);
if (err==146) while (IsTradeContextBusy()) Sleep(1000*11);
Print("Error(",err,") Close ",GetNameOP(OrderType())," ",
ErrorDescription(err),", try ",it);
Print(OrderTicket()," Ask=",pa," Bid=",pb," pp=",pp);
Print("sy=",OrderSymbol()," ll=",ll," sl=",OrderStopLoss(),
" tp=",OrderTakeProfit()," mn=",OrderMagicNumber());
Sleep(1000*5);
}
}
} elsePrint("Некорректная торговая операция. Close ",GetNameOP(OrderType()));
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 19.02.2008 |//| Описание : Закрытие позиций по рыночной цене сначала прибыльных |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" - любой символ, |//| NULL - текущий символ) |//| op - операция (-1 - любая позиция) |//| mn - MagicNumber (-1 - любой магик) |//+----------------------------------------------------------------------------+void ClosePosFirstProfit(string sy="", int op=-1, int mn=-1) {
int i, k=OrdersTotal();
if (sy=="0") sy=Symbol();
// Сначала закрываем прибыльные позицииfor (i=k-1; i>=0; i--) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (mn<0 || OrderMagicNumber()==mn) {
if (OrderProfit()+OrderCommission()+OrderSwap()>0) ClosePosBySelect();
}
}
}
}
}
// Потом все остальные
k=OrdersTotal();
for (i=k-1; i>=0; i--) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (mn<0 || OrderMagicNumber()==mn) ClosePosBySelect();
}
}
}
}
}
你能告诉我是否有可能把EA放到文件夹里,而不是把它们都存放在一个文件夹里....../experts?
而且,他们也从这些文件夹中工作。
我有一个EA的20个版本和另一个的20个版本,不可能解锁全套的文件。
下午好。
搜索没有任何帮助。
也许有人看到过类似的剧本。
重点:该脚本指定:符号、买/卖、数量
应该有5-7个这样的字段。
用于在几个符号上同时开盘,其体积不等于0。
谢谢你。
真诚的。
我有一个问题,我不知道如何解决,我试着解释一下。
因此,在我发布的代码中,有两个函数
在 void PrepareTicketsToClose(int signal, bool Revers, int & ticketsClose[][2], double & lots[],double arrayTickets[][9])中,我们必须放一个条件,决定我们是否应该离开或关闭订单。
我试着设置条件,但没有任何效果....
谁能看一下,看看这些函数中是否有错误,或者我弄错了....。
下午好。
搜索没有任何帮助。
也许有人看到过类似的剧本。
重点:该脚本指定:符号、买/卖、数量
应该有5-7个这样的字段。
用于在几个符号上同时打开,其体积不等于0。
谢谢你。
真诚的。
那是一个地狱般的措辞。提问者所问的是...
下午好。我有个问题要问你....以随机方式进入(5,14,3),也以随机方式退出,但有另一个周期(5,3,3)。我不知道我怎么能在退出时使用随机指数,但在返回时却不使用。
我有一个问题,我不知道如何解决,我试着解释一下。
在我编写的代码中,有两个函数
在 void PrepareTicketsToClose(int signal, bool Revers, int & ticketsClose[][2], double & lots[],double arrayTickets[][9])中,我们必须放一个条件,决定我们是否应该离开或关闭订单。
我试着设置条件,但没有任何效果....
谁能看一下,看看这些功能是否有错误,或者我搞砸了....。
也许这将是有帮助的。我没有看你的代码。
金的职能。
下午好。我有个问题要问你....我通过随机指数(5,14,3)进入,并通过随机指数退出,只有另一个周期(5,3,3)。我不明白为什么我可以在退出时使用随机指数,但不能使用返回信号?
我认为,我不会创建一个 要关闭的票据数组,而是在市场订单 枚举循环中,通过将票据送入关闭函数输入,检查每个订单的可能条件。
在任何时候出价都可以是0吗?
措辞非常好。提问者所问的是...
有一些脚本可以在一个符号上同时打开卖出,然后再买入。
我对一个脚本感兴趣,它可以同时在7-10个符号上打开卖出/买入,每个符号都有指定的数量,以当前的价格。
例子。
卖出欧元兑美元1
买入英镑兑美元1.5
卖出美元兑加元1.2
买入澳元兑美元1.1
买入NZDUSD 2
买入USDCHF 3
MultiOrders 脚本几乎是完美的,只是有5个字段的符号。
有一些脚本可以在一个符号上同时打开卖出,然后再买入。
我对一个脚本感兴趣,它可以同时在7-10个符号上打开卖出/买入,每个符号都有指定的数量,以当前的价格。
例子。
卖出欧元兑美元1
买入英镑兑美元1.5
卖出美元兑加元1.2
买入澳元兑美元1.1
买入NZDUSD 2
买入USDCHF 3
MultiOrders 脚本几乎是完美的,只是有5个字段的符号。