[ВНИМАНИЕ, ТЕМА ЗАКРЫТА!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда. - страница 910

 
Vinin:

Виктор, посмотрите личку, пожалуйста.
 
glasha:
Виктор, посмотрите личку, пожалуйста.

Видел
 
dimon74:

OrderSend() срабатывает при каждом тике (я так понимаю). Чтобы снять проблему об'являеш переменную перед функцией start, например int Н=0.

Дальше код:

..........

if ( Н==0)

{

OrderSend(бла-бла-бла);

}

H=1;

И не надо алгебры. А OrdersTotal() для ограничения лучше не использовать.


это то понятно,у меня все работает,я имею в виду чтобы у меня открывался 1 ордер,и чтобы при следующем тике не открывался

второй ордер,второй надо только когда первый закроется

 

если я не ошибаюсь, то наверно так?

int Н=0;

int F=OrdersTotal();

..........

if(F<1)

{

if ( Н==0)

{

OrderSend(бла-бла-бла);

}

H=1;}

 
gheka:

если я не ошибаюсь, то наверно так?

int Н=0;

int F=OrdersTotal();

..........

if(F<1)

{

if ( Н==0)

{

OrderSend(бла-бла-бла);

}

H=1;}

total = CountTrades();
if (total < 1) {
ticket = OrderSend
}

int CountTrades() {
   int count = 0;
   for (int trade = OrdersTotal() - 1; trade >= 0; trade--) {
      OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
         if (OrderType() == OP_SELL || OrderType() == OP_BUY) count++;
   }
   return (count);
}
 
gheka:


это то понятно,у меня все работает,я имею в виду чтобы у меня открывался 1 ордер,и чтобы при следующем тике не открывался

второй ордер,второй надо только когда первый закроется

Посмотри здесь.
 

Добрый день всем. В написании советников я не силен, пытался изучить это дело, но только начал и довольно тяжело для меня. Хочу написать советник, который бы открывал сделки при пересечении цены скользящей средней, а закрывал их при обратном пересечении, либо по стоп лоссу либо по трейлинг стопу. Нашел пример такого советника, но там нет ни трейлингстопа ни стоп лосса, а сделки открываются и закрываются просто при пересечении. Самому не хватает знаний. Помогите плиз кто-нибудь, где нужно встапить трейлингстоп  и стоплосс и как это правильно сделать, чтобы они работали:

#property copyright "Jake Sunders"

#property link "feloq@mail.ru"



#define STATE_SQUARE 0

#define STATE_LONG 1

#define STATE_SHORT 2



//---- input parameters

extern int MAPeriod=26;
extern double LotsNumber=1.0;
extern double TrailingStop = 50;
extern double StopLoss= 50;


//---- глобальные переменные

int CurrentState;

int MyOrderTicket;

//+------------------------------------------------------------------+

//| expert initialization function |

//+------------------------------------------------------------------+

int init()

{

//----

if (iMA(NULL, 0, MAPeriod, 0, MODE_SMA, PRICE_CLOSE, 0) > Close[0])

CurrentState = STATE_SHORT;

else CurrentState = STATE_LONG;

MyOrderTicket = 0;
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
//----
int err;
double MA;
MA = iMA(NULL, 0, MAPeriod, 0, MODE_EMA, PRICE_CLOSE, 0);
if ( CurrentState == STATE_LONG)
{
if (MA > Close[1]) //скользящая средняя выше цены закрытия
{
CurrentState = STATE_SHORT;
//переворачиваемся в продажу
//---закрыть позицию, если была открыта
if ( MyOrderTicket != 0)
{
if (!OrderClose(MyOrderTicket, LotsNumber, Bid, 3, CLR_NONE))
{
err = GetLastError();
Print("Ошибка при закрытии позиции: ", err);
return(0);
}
MyOrderTicket = 0;
}
RefreshRates();
//--- длинная позиция была закрыта успешно
//--- теперь откроем позицию в продажу
//--- проверим на наличие свободных средств
MyOrderTicket = OrderSend(Symbol(), OP_SELL, LotsNumber, Bid, 3, 0, 0,
NULL, 0, 0, CLR_NONE);
if (MyOrderTicket<0)
{
err = GetLastError();
Print("Ошибка при открытии позиции: ", err);
MyOrderTicket = 0;
}
}
}
else
{
if (MA < Close[1]) //скользящая средняя ниже цены закрытия
{
CurrentState = STATE_LONG;

//переворачиваемся в покупку
//---закрыть позицию, если была открыта
if ( MyOrderTicket != 0)
{
if (!OrderClose(MyOrderTicket, LotsNumber, Ask, 3, CLR_NONE))
{
err = GetLastError();
Print("Ошибка при закрытии позиции: ", err);
return(0);
}
MyOrderTicket = 0;
}
RefreshRates();
//--- короткая позиция была закрыта успешно
//--- теперь откроем позицию в покупку
//--- проверим на наличие свободных средств
MyOrderTicket = OrderSend(Symbol(), OP_BUY, LotsNumber, Ask, 3, 0, 0,
NULL, 0, 0, CLR_NONE);
if (MyOrderTicket<0)
{
err = GetLastError();
Print("Ошибка при открытии позиции: ", err);
MyOrderTicket = 0;
}
}
}
//----
return(0);
}

 

Люди, подскажите пожалуйста! Как сделать так, чтобы позиция открывалась и закрывалась по истечению какой-либо свечки или свечек? То есть открывается при открытии новой свечки, закрывается

при закрытии этой же свечки или любой другой заданной? и как для какого-либо условия открытия позиции брать значения индикатора при закрытии свечки?

 
gheka:

у меня ордера на покупку и продажу открывают по одной цене чуть ли не по 50-100 позиций,

как сделать чтобы у меня открывался только один ордер,если я не ошибаюсь то OrdersTotal()

и если это так, то как его использовать? и где его ставить? а то я чувствую без этой функции целую алгебру надо вбивать


Не правильные условия для совершения сделок, см. пример для двух МА.
 
Superjake:

Добрый день всем. В написании советников я не силен, пытался изучить это дело, но только начал и довольно тяжело для меня. Хочу написать советник, который бы открывал сделки при пересечении цены скользящей средней, а закрывал их при обратном пересечении, либо по стоп лоссу либо по трейлинг стопу. Нашел пример такого советника, но там нет ни трейлингстопа ни стоп лосса, а сделки открываются и закрываются просто при пересечении. Самому не хватает знаний. Помогите плиз кто-нибудь, где нужно встапить трейлингстоп и стоплосс и как это правильно сделать, чтобы они работали:

#property copyright "Jake Sunders"

#property link "feloq@mail.ru"



#define STATE_SQUARE 0

#define STATE_LONG 1

#define STATE_SHORT 2



//---- input parameters

extern int MAPeriod=26;
extern double LotsNumber=1.0;
extern double TrailingStop = 50;
extern double StopLoss= 50;


//---- глобальные переменные

int CurrentState;

int MyOrderTicket;

//+------------------------------------------------------------------+

//| expert initialization function |

//+------------------------------------------------------------------+

int init()

{

//----

if (iMA(NULL, 0, MAPeriod, 0, MODE_SMA, PRICE_CLOSE, 0) > Close[0])

CurrentState = STATE_SHORT;

else CurrentState = STATE_LONG;

MyOrderTicket = 0;
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
//----
int err;
double MA;
MA = iMA(NULL, 0, MAPeriod, 0, MODE_EMA, PRICE_CLOSE, 0);
if ( CurrentState == STATE_LONG)
{
if (MA > Close[1]) //скользящая средняя выше цены закрытия
{
CurrentState = STATE_SHORT;
//переворачиваемся в продажу
//---закрыть позицию, если была открыта
if ( MyOrderTicket != 0)
{
if (!OrderClose(MyOrderTicket, LotsNumber, Bid, 3, CLR_NONE))
{
err = GetLastError();
Print("Ошибка при закрытии позиции: ", err);
return(0);
}
MyOrderTicket = 0;
}
RefreshRates();
//--- длинная позиция была закрыта успешно
//--- теперь откроем позицию в продажу
//--- проверим на наличие свободных средств
MyOrderTicket = OrderSend(Symbol(), OP_SELL, LotsNumber, Bid, 3, 0, 0,
NULL, 0, 0, CLR_NONE);
if (MyOrderTicket<0)
{
err = GetLastError();
Print("Ошибка при открытии позиции: ", err);
MyOrderTicket = 0;
}
}
}
else
{
if (MA < Close[1]) //скользящая средняя ниже цены закрытия
{
CurrentState = STATE_LONG;

//переворачиваемся в покупку
//---закрыть позицию, если была открыта
if ( MyOrderTicket != 0)
{
if (!OrderClose(MyOrderTicket, LotsNumber, Ask, 3, CLR_NONE))
{
err = GetLastError();
Print("Ошибка при закрытии позиции: ", err);
return(0);
}
MyOrderTicket = 0;
}
RefreshRates();
//--- короткая позиция была закрыта успешно
//--- теперь откроем позицию в покупку
//--- проверим на наличие свободных средств
MyOrderTicket = OrderSend(Symbol(), OP_BUY, LotsNumber, Ask, 3, 0, 0,
NULL, 0, 0, CLR_NONE);
if (MyOrderTicket<0)
{
err = GetLastError();
Print("Ошибка при открытии позиции: ", err);
MyOrderTicket = 0;
}
}
}
//----
return(0);
}


Посмотрите этот пример
Причина обращения: