Выставление ордеров - страница 3

 
MakarFX:
Vinin:

SK. писал (а):

Вы можете посмеяться. Смех продлевает жизнь.

Я не нашел нормального объяснения, что такое "cnt",

а в справке только для умных

index - Позиция ордера или номер ордера в зависимости от второго параметра.

А про 2-ой параметр читали? Действительно у вас путь еще очень длинный и не спешите начинать.
 
Я тут уже не первую неделю крапаю советника, чтоб торговал в любую сторону и все ордера считал как надо и вот что у меня получилось (функция учета ордеров, может кому пригодится):
//+-------------------------------------------------------------------------+
//| Контроль открытых позиций |
//+-------------------------------------------------------------------------+
void ControlOpenOrders()
{
baselots=lots;
int i;
int total=OrdersTotal();
double priceopen,takeprofit,minprofitsell,minprofitbuy,maxprofitbuy,maxprofitsell;
int ticket,ticketSTO,sellticketclosed,buyticketclosed;
datetime opentimesell,opentimebuy;
countL=0; countS=0; // счетчики ордеров, инициализируются как статичесие переменные (практически все)
buylots=0; selllots=0; // количество лотов в покупке и в продаже
countLSTO=0; countSSTO=0; // счетчики лонг(L) и шорт(S) стоп-ордеров
selllotsSTO=0; buylotsSTO=0; // счетчики лотов в отложенных ордерах, собственно в любой момент мы имеем один отложенный ордер
profitsell=0; profitbuy=0; sumprofit=0; // профит в покупке, продаже и суммарный

for(i=total-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==false)
break;
//----
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
{
if(OrderType()==OP_BUY)
{
countL++;
buylots=buylots+OrderLots();
profitbuy=profitbuy+OrderProfit();
if(maxprof==true)
{
if(maxprofitbuy==0) maxprofitbuy=OrderProfit();
if(maxprofitbuy<=OrderProfit())
{//находим ордер с максимальным профитом и запоминаем тикет
maxprofitbuy=OrderProfit();
buyticketclosed=OrderTicket();
}
}
if(minprof==true)
{
if(minprofitbuy==0) minprofitbuy=MathAbs(OrderProfit());
if(MathAbs(OrderProfit())<=minprofitbuy)
{//находим ордер с профитом или убытком близким к нулю и запоминаем тикет
minprofitbuy=MathAbs(OrderProfit());
buyticketclosed=OrderTicket();
}
}
if(optime==true)
{
if(countL<=1) opentimebuy=OrderOpenTime();
if(opentimebuy-OrderOpenTime()>0)
{ //находим самый ранний и запоминаем тикет
opentimebuy=OrderOpenTime();
buyticketclosed=OrderTicket();
}
}
}
if(OrderType()==OP_SELL)
{
countS++;
selllots=selllots+OrderLots();
profitsell=profitsell+OrderProfit();
if(maxprof==true)
{
if(maxprofitsell==0) maxprofitsell=OrderProfit();
if(maxprofitsell<=OrderProfit())
{//находим ордер с максимальным профитом и запоминаем тикет
maxprofitsell=OrderProfit();
sellticketclosed=OrderTicket();
}
}
if(minprof==true)
{
if(minprofitsell==0) minprofitsell=MathAbs(OrderProfit());
if(MathAbs(OrderProfit())<=minprofitsell)
{//находим ордер с (минимальным) профитом или убытком и запоминаем тикет
minprofitsell=MathAbs(OrderProfit());
sellticketclosed=OrderTicket();
}
}
if(optime==true)
{
if(countS<=1) opentimesell=OrderOpenTime();
if(opentimesell-OrderOpenTime()>0)
{ //находим самый ранний и запоминаем тикет
opentimesell=OrderOpenTime();
sellticketclosed=OrderTicket();
}
}
}

if(OrderType()==OP_BUYSTOP)
{
countLSTO++;
buylotsSTO=buylotsSTO+OrderLots();
ticketSTO=OrderTicket();
}
if(OrderType()==OP_SELLSTOP)
{
countSSTO++;
selllotsSTO=selllotsSTO+OrderLots();
ticketSTO=OrderTicket();
}
}
}
if(selllots+buylots>=MaximumLots)
{
if(OrderSelect(buyticketclosed, SELECT_BY_TICKET)==true && OrderSelect(sellticketclosed, SELECT_BY_TICKET)==true)
if(!OrderCloseBy(buyticketclosed,sellticketclosed,White))
{
Print("Failed to closed order: #",buyticketclosed," by order: #", sellticketclosed,
" ExpertMagic: ",MagicNumber," Превышение лимита открытых ордеров");
return;
}
}
//--------- расчет размера лота отложенной позиции
{if(difference==true)
defenselots=NormalizeDouble(MathAbs(buylots-selllots)*2+baselots, mmfx);
else
defenselots=NormalizeDouble(MathAbs(buylots-selllots)+baselots, mmfx);}
if(buylots>selllots)
{ // если кол-во лотов в покупке больше чем в продаже ставим защитный ордер в продажу, сначала проверим может уже есть
priceopen=NormalizeDouble(lastfractallow-lowshade*Point, Digits);
if(selllotsSTO>0)
{ // если ордер есть и размер лота не соответствует (вышел из обоймы рыночный ордер по лимиту или стопу)...
if(OrderSelect(ticketSTO, SELECT_BY_TICKET)==true)
{ // ...удаляем
if(selllotsSTO!=defenselots)
{
OrderDelete(ticketSTO);
selllotsSTO--;
Print("Удален ордер #",ticketSTO," количество лотов не соответствует расчетному");
}
else
{ // проверяем, не является ли курс его открытия ниже, чем lastfractallow-lowshade*Point
RefreshRates();
if(OrderOpenPrice()-priceopen<0 && priceopen-Bid+MarketInfo(Symbol(), MODE_STOPLEVEL)*Point<0)
{ // если так, ордер модифицируем
if(!OrderModify(OrderTicket(),priceopen,0,OrderTakeProfit(),0,Red))
{
Print("Failed to modify order #",OrderTicket()," open price. Err. : ",GetLastError());
}
}
}
}
}
else
{ // ну, а если отложенных ордеров нет, то просто ставим такой
RefreshRates();
if(tps>0) takeprofit=NormalizeDouble(priceopen-tps*Point, Digits); else takeprofit=0;
//if(priceopen-Bid+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point<0)
ticket=OrderSend(Symbol(),OP_SELLSTOP,defenselots,priceopen,slippage,0,takeprofit, "",MagicNumber,0,Red);
if(ticket>0)
{
Print(" Поставлен защитный ордер : #",ticket," sellstop open at ",priceopen, " ExpertMagic: ",MagicNumber);
selllotsSTO++;
Sleep(3000);
}
}
}
if(buylots<selllots)
{ // если кол-во лотов в покупке меньше чем в продаже ставим защитный ордер в покупку, сначала проверим может уже есть
priceopen=NormalizeDouble(lastfractalhigh+(spread+highshade)*Point, Digits);
if(buylotsSTO>0)
{ // если ордер есть и размер лота не соответствует (вышел из обоймы рыночный ордер по лимиту или стопу)...
if(OrderSelect(ticketSTO, SELECT_BY_TICKET)==true)
{ // ...удаляем
if(buylotsSTO!=defenselots)
{
OrderDelete(ticketSTO);
buylotsSTO--;
Print("Удален ордер #",ticketSTO," количество лотов не соответствует расчетному");
}
else
{ // если с лотом все в порядке проверяем, не является ли курс его открытия выше, чем lastfractalhigh+spread
RefreshRates();
if(OrderOpenPrice()-priceopen>0 && priceopen-Ask-MarketInfo(Symbol(), MODE_STOPLEVEL)*Point>0)
{// если так, ордер модифицируем
if(!OrderModify(OrderTicket(),priceopen,0,OrderTakeProfit(),0,Blue))
{
Print("Failed to modify order #",OrderTicket()," open price. Err. : ",GetLastError());
}
}
}
}
}
else
{ // ну, а если отложенных ордеров нет, то просто ставим такой
RefreshRates();
if(tpb>0) takeprofit=NormalizeDouble(priceopen+tpb*Point, Digits); else takeprofit=0;
//if(priceopen-Ask-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point>0)
ticket=OrderSend(Symbol(),OP_BUYSTOP,defenselots,priceopen,slippage,0,takeprofit, "",MagicNumber,0,Blue);
if(ticket>0)
{
Print(" Поставлен защитный ордер : #",ticket," buystop open at ",priceopen, " ExpertMagic: ",MagicNumber);
buylotsSTO++;
Sleep(3000);
}
}
}

sumprofit=profitsell+profitbuy;

Comment("ExpertMagic: ",MagicNumber," Прибыль советника: ",sumprofit,"\n", "Торговый диапазон: ", traderange," High: ",
lastfractalhigh," Low: ",lastfractallow,"\n","Базовый лот: ",baselots, " Сигнал: ",signal(),"\n","BUY Orders: ",
countL," Profit / Lots: ",profitbuy," / ",buylots,"\n", "SELL Orders: ",countS," Profit / Lots: ",profitsell," / ",
selllots,"\n","Отложенные ордера: SellStop - ",selllotsSTO," лота "," BuyStop - ",buylotsSTO," лота");

return;
}

Писал я это под систему упоминавшеюся, по моему у Вильямса, ". ..открываем 1 лот бай и ставим отложенный ордер 2 лота селл ниже фрактала. " (это не цитат, а примерный смысл). Короче блок работает,  если происходит изменение с ордерами в торговле закрытие по стопу,  например, то отложенный удаляется, и если надо ставится другой с пересчитанным количеством лотов.
Кому интересно, а тем более кому надо, думаю разберутся. Сам я не программер, копаю здесь же...:))  Если кто из программистов при внимательном рассмотрении увидит какие несуразности и укажет на них, буду признателен.