как работает OrderSelect и OrderClose

 

В учебнике читал, но там смутно написано... Мне неясно как в программе можно выбрать именно тот ордер для его закрытия, который мне нужен?

Пожалуйсто если есть возможность, приведите простые примеры с описанием!

 
forexfor писал(а) >>

В учебнике читал, но там смутно написано... Мне неясно как в программе можно выбрать именно тот ордер для его закрытия, который мне нужен?

Пожалуйсто если есть возможность, приведите простые примеры с описанием!

Вам прийдется пересмотреть все ордера и найти нужный Вам ордер по внешним признакам: цена открытия, P/L, размер лота и др.

 
api писал(а) >>

Вам прийдется пересмотреть все ордера и найти нужный Вам ордер по внешним признакам: цена открытия, P/L, размер лота и др.

я пробовал это сделать с помощью OrderType(), но может вписал не так, ордер не закрывается


extern double Lots=0.04;
extern int K=5;
extern int D=3;
extern int Z=3;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+

int start() // Спец. функция start
{
double M_0, M_1, // Значение MAIN на 0 и 1 барах
S_0, S_1; // Значение SIGNAL на 0 и 1барах

int ticket, kolichectvoorderov,order_type;
//--------------------------------------------------------------------
// Обращение к функции техн.индикат.
M_0 = iStochastic(NULL,0,K,D,Z,MODE_SMMA,0,MODE_MAIN, 0);// 0 бар,M_0 на нулевом баре имеет это значение
M_1 = iStochastic(NULL,0,K,D,Z,MODE_SMMA,0,MODE_MAIN, 1);// 1 бар,M_1 на предыдущем баре имеет это значение
S_0 = iStochastic(NULL,0,K,D,Z,MODE_SMMA,0,MODE_SIGNAL,0);// 0 бар,S_0 на нулевом баре имеет это значение
S_1 = iStochastic(NULL,0,K,D,Z,MODE_SMMA,0,MODE_SIGNAL,1);// 1 бар,S_1 на предыдущем баре имеет это значение
//--------------------------------------------------------------------

// описание вводимых данных в осцилятор стокхастик
//-------------------------------------------------------------------------------------------------------------------------+
//double iStochastic(string symbol, int timeframe, int %Kperiod, int %Dperiod, +
// int slowing, int method, int price_field, int mode, int shift) +
// symbol - символьное имя инструмента, на данных которого будет вычисляться индикатор. NULL означает текущий символ. +
// timeframe - период. Может быть одним из периодов графика. 0 означает период текущего графика. +
// %Kperiod - период(количество баров) для вычисления линии %K. +
// %Dperiod - период усреднения для вычисления линии %D. +
// slowing - значение замедления. +
// method - метод усреднения. Может быть любым из значений методов скользящего среднего (Moving Average): +
// MODE_SMA -0- Простое скользящее среднее; +
// MODE_EMA -1- Экспоненциальное скользящее среднее; +
// MODE_SMMA -2- Сглаженное скользящее среднее; +
// MODE_LWMA -3- Линейно-взвешенное скользящее среднее; +
// price_field - Параметр выбора цен для расчета. Может быть одной из следующих величин: 0 - Low/High или 1 - Close/Close.+
// mode - индекс линии индикатора. Может принимать одно из значений: +
// MODE_MAIN -0- Основная линия или MODE_SIGNAL -1- Сигнальная линия +
// shift - индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара +
// на указанное количество периодов назад). +
// данные бара берутся с текущего -0- и дальше в обратную сторону 1,2,3,4....... +
//-------------------------------------------------------------------------------------------------------------------------+
kolichectvoorderov=OrdersTotal();
if(kolichectvoorderov<1)
{//-----------------------------------------------------------------------------------------------------------
if( M_0 >= S_0 && M_1 < S_1 )
{
Alert("сигнальная пересекает трендовую с верху вниз. открываем покупку.OP_BUY");
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0);
Print("BUY order opened : ",OrderOpenPrice());
OrderSelect( ticket,SELECT_BY_TICKET,MODE_TRADES);
if(OrderType()==OP_SELL)
{
OrderClose (ticket,Lots,Bid,2,Red);
}
return(0);
}
else
{
if( M_0 <= S_0 && M_1 > S_1 )
{
Alert("сигнальная пересекает трендовую снизу вверх открываем продажу OP_SELL.");
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0);
Print("SELL order opened : ",OrderOpenPrice());
OrderSelect( ticket,SELECT_BY_TICKET,MODE_TRADES);
if(OrderType()==OP_BUY)
{
OrderClose (ticket,Lots,Bid,2,Red);
}
return(0);
}
}
}
return(0);
}

 
forexfor писал(а) >>

В учебнике читал, но там смутно написано... Мне неясно как в программе можно выбрать именно тот ордер для его закрытия, который мне нужен?

Пожалуйсто если есть возможность, приведите простые примеры с описанием!

В учебнике есть просто СУПЕР ПРИМЕР самого простого советника. Там есть все, кроме Трейлинг стоп, который надо добавить самостоятельно. Остальное меняете только в блоке создания торговых сигналов на открытия и закрытия. Вот адрес: Учебник по MQL4 Простые программы на MQL4 Простой эксперт

 
forexfor >>:

я пробовал это сделать с помощью OrderType(), но может вписал не так, ордер не закрывается


if( M_0 <= S_0 && M_1 > S_1 )

{

.

.

for (int i=0;i<OrdersTotal();i++)
{

if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
if(OrderType()==OP_BUY)

OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),MarketInfo(Symbol(),MODE_SPREAD));

}}

.

.

.

if( M_0 >= S_0 && M_1 < S_1 )

{
.

.

for (int ii=0;ii<OrdersTotal();ii++)
{

if(OrderSelect(ii,SELECT_BY_POS,MODE_TRADES)==true)
if(OrderType()==OP_SELL)

OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),MarketInfo(Symbol(),MODE_SPREAD));

}}

 
Незакрывается потому что в sell закрывается по цене bid, а bay по ask, поменяйте местами
 
arbuz >>:
Незакрывается потому что в sell закрывается по цене bid, а bay по ask, поменяйте местами

ошибаетесь!

Тип ордера Цена открытия Цена закрытия Цена открытия для отложенного ордера Преобразование отложенного ордера в рыночный
Buy
Ask

Bid



Sell
Bid

Ask



BuyLimit


Ниже текущей цены Ask Ask достигает цены открытия
SellLimit


Выше текущей цены Bid Bid достигает цены открытия
BuyStop


Выше текущей цены Ask Ask достигает цены открытия
SellStop


Ниже текущей цены Bid Bid достигает цены открытия
 
forex-k писал(а) >>
if( M_0 <= S_0 && M_1 > S_1 )

{

if( summaord<1)
{

.

.

}

for (int i=0;i<OrdersTotal();i++)
{

if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
if(OrderType()==OP_BUY)

OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),MarketInfo(Symbol(),MODE_SPREAD));

}}

.

.

.

if( M_0 >= S_0 && M_1 < S_1 )

{
.

.

for (int ii=0;ii<OrdersTotal();ii++)
{

if(OrderSelect(ii,SELECT_BY_POS,MODE_TRADES)==true)
if(OrderType()==OP_SELL)

OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),MarketInfo(Symbol(),MODE_SPREAD));

}}

СПАСИБО!!! получилось, только кое,что вставить пришлось
 
forexfor писал(а) >>

Константин, а не могли бы вы мне подсказать как и в какое место там трейлинг стоп вставить??? ну и стоп лосс тоже навсякий случай.. Пожалуйсто:)

 
forexfor >>:

Константин, а не могли бы вы мне подсказать как и в какое место там трейлинг стоп вставить??? ну и стоп лосс тоже навсякий случай.. Пожалуйсто:)

вот мои функции которые упрощают трейлинг sl

int shag=10;

int tral_sl=100;

//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+
int orders_buy()
{int j=0;for (int i=0;i<OrdersTotal();i++)
{if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
if((OrderType()==OP_BUY)&&(OrderSymbol()==Symbol()))j++;
}return(j);}
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+
int orders_sell()
{int j=0;for (int i=0;i<OrdersTotal();i++)
{if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
if((OrderType()==OP_SELL)&&(OrderSymbol()==Symbol()))j++;
}return(j);}

//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+
double OrderStopLosS()
{double j=0;for (int i=0;i<OrdersTotal();i++)
{if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
{if(OrderSymbol()==Symbol())j=OrderStopLoss();}
}return(j);}
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+
double OrderOpenPricE()
{double j=0;for (int i=0;i<OrdersTotal();i++)
{if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
{if(OrderSymbol()==Symbol())j=OrderOpenPrice();}
}return(j);}
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+
double OrderTakeProfiT()
{double j=0;for(int i=0;i<OrdersTotal();i++)
{if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
{if(OrderSymbol()==Symbol())j=OrderTakeProfit();}
}return(j);}
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+
int tiket()
{int j=0;for (int i=0;i<OrdersTotal();i++)
{if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
{if(OrderSymbol()==Symbol())j=OrderTicket();}
}return(j);}
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+
int modify_sl_buy()
{
OrderModify(tiket(),OrderOpenPricE(),OrderStopLosS()+shag*Point,OrderTakeProfiT(),0);
Print(GetLastError());
}
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+
int modify_sl_sell()
{
OrderModify(tiket(),OrderOpenPricE(),OrderStopLosS()-shag*Point,OrderTakeProfiT(),0);
Print(GetLastError());
}
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+

int start()

{

.

.

.

if((orders_buy()==1)&&(Bid-OrderStopLosS()>tral_sl*Point))

{

modify_sl_buy();

}

if((orders_sell()==1)&&(OrderStopLosS()-Bid>tral_sl*Point))

{

modify_sl_sell();

}

.

.

.


}

 
forex-k писал(а) >>

вот мои функции которые упрощают трейлинг sl

int shag=10;

int tral_sl=100;

//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+
int orders_buy()
{int j=0;for (int i=0;i<OrdersTotal();i++)
{if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
if((OrderType()==OP_BUY)&&(OrderSymbol()==Symbol()))j++;
}return(j);}
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+
int orders_sell()
{int j=0;for (int i=0;i<OrdersTotal();i++)
{if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
if((OrderType()==OP_SELL)&&(OrderSymbol()==Symbol()))j++;
}return(j);}

//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+
double OrderStopLosS()
{double j=0;for (int i=0;i<OrdersTotal();i++)
{if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
{if(OrderSymbol()==Symbol())j=OrderStopLoss();}
}return(j);}
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+
double OrderOpenPricE()
{double j=0;for (int i=0;i<OrdersTotal();i++)
{if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
{if(OrderSymbol()==Symbol())j=OrderOpenPrice();}
}return(j);}
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+
double OrderTakeProfiT()
{double j=0;for(int i=0;i<OrdersTotal();i++)
{if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
{if(OrderSymbol()==Symbol())j=OrderTakeProfit();}
}return(j);}
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+
int tiket()
{int j=0;for (int i=0;i<OrdersTotal();i++)
{if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
{if(OrderSymbol()==Symbol())j=OrderTicket();}
}return(j);}
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+
int modify_sl_buy()
{
OrderModify(tiket(),OrderOpenPricE(),OrderStopLosS()+shag*Point,OrderTakeProfiT(),0);
Print(GetLastError());
}
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+
int modify_sl_sell()
{
OrderModify(tiket(),OrderOpenPricE(),OrderStopLosS()-shag*Point,OrderTakeProfiT(),0);
Print(GetLastError());
}
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+

int start()

{

.

.

.

if((orders_buy()==1)&&(Bid-OrderStopLosS()>tral_sl*Point))

{

modify_sl_buy();

}

if((orders_sell()==1)&&(OrderStopLosS()-Bid>tral_sl*Point))

{

modify_sl_sell();

}

.

.

.

}

Болбшое Вам спасибо!!! Сейчас попробую разобраться... О результатах напишу

Причина обращения: