Единственное, функция Closeall закрывает реально все ордера, вот её код:
int Closeall ()
{int slippage=2;
for (int i=OrdersTotal()-1; i>=0; i--)
{
if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break;
if (OrderType()==OP_BUY ) OrderClose (OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),slippage);
if (OrderType()==OP_SELL) OrderClose (OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),slippage);
}
}
Я сейчас поищу такую, что бы закрывала только те, что с мэйджиком... Если не сложно - помогите найти, или доработать эту и советник будет доделан.
Единственное, функция Closeall закрывает реально все ордера, вот её код:
int Closeall ()
{int slippage=2;
for (int i=OrdersTotal()-1; i>=0; i--)
{
if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break;
if (OrderType()==OP_BUY ) OrderClose (OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),slippage);
if (OrderType()==OP_SELL) OrderClose (OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),slippage);
}
}
Я сейчас поищу такую, что бы закрывала только те, что с мэйджиком... Если не сложно - помогите найти, или доработать эту и советник будет доделан.
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 19.02.2008 |//| Описание : Закрытие позиций по рыночной цене |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" - любой символ, |//| NULL - текущий символ) |//| op - операция (-1 - любая позиция) |//| mn - MagicNumber (-1 - любой магик) |//+----------------------------------------------------------------------------+void ClosePositions(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) ClosePosBySelect();
}
}
}
}
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 19.02.2008 |//| Описание: Закрытие одной предварительно выбранной позиции |//+----------------------------------------------------------------------------+void ClosePosBySelect() {
bool fc;
color clClose;
double ll, pa, pb, pp;
int 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();
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()));
}
//+----------------------------------------------------------------------------+//| Возвращает наименование торговой операции |//| Параметры: |//| op - идентификатор торговой операции |//+----------------------------------------------------------------------------+string GetNameOP(int op) {
switch (op) {
case OP_BUY : return("Buy");
case OP_SELL : return("Sell");
case OP_BUYLIMIT : return("Buy Limit");
case OP_SELLLIMIT: return("Sell Limit");
case OP_BUYSTOP : return("Buy Stop");
case OP_SELLSTOP : return("Sell Stop");
default : return("Unknown Operation");
}
}
Всё, доделал. Доработал сам функцию Closeall(). Сторонник того, что всё должно быть просто:
int Closeall () {int slippage=2; for (int i=OrdersTotal()-1; i>=0; i--) { if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break; if (OrderType()==OP_BUY && OrderMagicNumber() == Magic ) OrderClose (OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),slippage); if (OrderType()==OP_SELL && OrderMagicNumber() == Magic) OrderClose (OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),slippage); } }
Пробуйте.
Просто это только для тестера. Для реала будет сложнее. С обработкой ошибок и повторной посылкой команд в случае реквотов или других ошибок исполнения ордера, как это сделано у Кима.
khorosh:
Просто это только для тестера. Для реала будет сложнее. С обработкой ошибок и повторной посылкой команд в случае реквотов или других ошибок исполнения ордера, как это сделано у Кима.
Да, согласен на все 100. Я это подчеркнул в начале.
khorosh:
Ничего сложного. Есть же функция у Кима с магиком.
ОК. Допустим, в советнике дополним:
extern int Magic = 737;
В Ordersend тоже Magic пропишем по всем трём парам.
А в эту функцию куда вставить Magic тогда??
чето не трейдит, пишет - unknown symbol name USDCHF for OrderSend function. И тоже для ПИЗГЫВ, запускаю на EURUSD
В обзоре рынка есть инструмент этот? И посмотрите, в вашем терминале у названий пар ВЕРХНИЙ регистр?
ОК. Допустим, в советнике дополним:
extern int Magic = 737;
В Ordersend тоже Magic пропишем по всем трём парам.
А в эту функцию куда вставить Magic тогда??
{
//Закрываем все ордера
}
if(GetProfitOpenPosInCurrency("EURUSD",OP_BUY, Magic)+GetProfitOpenPosInCurrency("GBPUSD",OP_BUY, Magic)+GetProfitOpenPosInCurrency("USDCHF",OP_BUY, Magic)>=Profit)
{
//Закрываем все ордера
}
У меня получилось по-другому:
if (OrdersTotal()>1 && GetProfitOpenPosInCurrency("", -1, Magic)>Profit || GetProfitOpenPosInCurrency("", -1, Magic)<-Stop)
Closeall();
Единственное, функция Closeall закрывает реально все ордера, вот её код:
int Closeall ()
{int slippage=2;
for (int i=OrdersTotal()-1; i>=0; i--)
{
if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break;
if (OrderType()==OP_BUY ) OrderClose (OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),slippage);
if (OrderType()==OP_SELL) OrderClose (OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),slippage);
}
}
Я сейчас поищу такую, что бы закрывала только те, что с мэйджиком... Если не сложно - помогите найти, или доработать эту и советник будет доделан.
У меня получилось по-другому:
if (OrdersTotal()>1 && GetProfitOpenPosInCurrency("", -1, Magic)>Profit || GetProfitOpenPosInCurrency("", -1, Magic)<-Stop)
Closeall();
Единственное, функция Closeall закрывает реально все ордера, вот её код:
int Closeall ()
{int slippage=2;
for (int i=OrdersTotal()-1; i>=0; i--)
{
if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break;
if (OrderType()==OP_BUY ) OrderClose (OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),slippage);
if (OrderType()==OP_SELL) OrderClose (OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),slippage);
}
}
Я сейчас поищу такую, что бы закрывала только те, что с мэйджиком... Если не сложно - помогите найти, или доработать эту и советник будет доделан.
Всё, доделал. Доработал сам функцию Closeall(). Сторонник того, что всё должно быть просто:
int Closeall ()
{int slippage=2;
for (int i=OrdersTotal()-1; i>=0; i--)
{
if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break;
if (OrderType()==OP_BUY && OrderMagicNumber() == Magic ) OrderClose (OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),slippage);
if (OrderType()==OP_SELL && OrderMagicNumber() == Magic) OrderClose (OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),slippage); - хотя, эту строчку можно удалить нахрен!! :)
}
}
Пробуйте.
if (OrdersTotal()>1 && GetProfitOpenPosInCurrency("", -1, Magic)>Profit || GetProfitOpenPosInCurrency("", -1, Magic)<-Stop)
Closeall();
Если в функции не указывать символ, то закроется только ордер с символом на графике которого установлен эксперт.
У меня получилось по-другому:
if (OrdersTotal()>1 && GetProfitOpenPosInCurrency("", -1, Magic)>Profit || GetProfitOpenPosInCurrency("", -1, Magic)<-Stop)
Closeall();
Если в функции не указывать символ, то закроется только ордер с символом на графике которого установлен эксперт.
У меня закрывается всё..
Всё, доделал. Доработал сам функцию Closeall(). Сторонник того, что всё должно быть просто:
int Closeall ()
{int slippage=2;
for (int i=OrdersTotal()-1; i>=0; i--)
{
if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break;
if (OrderType()==OP_BUY && OrderMagicNumber() == Magic ) OrderClose (OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),slippage);
if (OrderType()==OP_SELL && OrderMagicNumber() == Magic) OrderClose (OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),slippage);
}
}
Пробуйте.
Просто это только для тестера. Для реала будет сложнее. С обработкой ошибок и повторной посылкой команд в случае реквотов или других ошибок исполнения ордера, как это сделано у Кима.
Да, согласен на все 100. Я это подчеркнул в начале.