Старая идея. Нужен Советник. - страница 2

 
чето не трейдит, пишет - unknown symbol name USDCHF for OrderSend function. И тоже для ПИЗГЫВ, запускаю на EURUSD
 

khorosh:

Ничего сложного. Есть же функция у Кима с магиком.


ОК. Допустим, в советнике дополним:

extern int Magic = 737;

В Ordersend тоже Magic пропишем по всем трём парам.

А в эту функцию куда вставить Magic тогда??

чето не трейдит, пишет - unknown symbol name USDCHF for OrderSend function. И тоже для ПИЗГЫВ, запускаю на EURUSD

В обзоре рынка есть инструмент этот? И посмотрите, в вашем терминале у названий пар ВЕРХНИЙ регистр?

 
Cmu4:


ОК. Допустим, в советнике дополним:

extern int Magic = 737;

В Ordersend тоже Magic пропишем по всем трём парам.

А в эту функцию куда вставить Magic тогда??


if(GetProfitOpenPosInCurrency("EURUSD",OP_BUY, Magic)+GetProfitOpenPosInCurrency("GBPUSD",OP_BUY, Magic)+GetProfitOpenPosInCurrency("USDCHF",OP_BUY, Magic)>=Profit)

{

//Закрываем все ордера

}

 
khorosh:
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);
}
}

Я сейчас поищу такую, что бы закрывала только те, что с мэйджиком... Если не сложно - помогите найти, или доработать эту и советник будет доделан.

 
Cmu4:


У меня получилось по-другому:

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);
}
}

Я сейчас поищу такую, что бы закрывала только те, что с мэйджиком... Если не сложно - помогите найти, или доработать эту и советник будет доделан.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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);
      }
    }
  } else Print("Некорректная торговая операция. 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); - хотя, эту строчку можно удалить нахрен!! :)
}
}


Пробуйте.

Файлы:
 
У меня получилось по-другому:

if (OrdersTotal()>1 && GetProfitOpenPosInCurrency("", -1, Magic)>Profit || GetProfitOpenPosInCurrency("", -1, Magic)<-Stop)

Closeall();

Если в функции не указывать символ, то закроется только ордер с символом на графике которого установлен эксперт.

 
khorosh:
У меня получилось по-другому:

if (OrdersTotal()>1 && GetProfitOpenPosInCurrency("", -1, Magic)>Profit || GetProfitOpenPosInCurrency("", -1, Magic)<-Stop)

Closeall();

Если в функции не указывать символ, то закроется только ордер с символом на графике которого установлен эксперт.


У меня закрывается всё..
 
Cmu4:

Всё, доделал. Доработал сам функцию 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. Я это подчеркнул в начале.
Причина обращения: