Как выбирать открытые ордера по всем инструментам сразу? - страница 4

 
evillive:

Тогда это только усугубит общий минус по оставшимся открытыми позициям. Но делайте как хотите.


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

Пример: for(cnt=0;cnt<total;cnt++)

{
OrderSelect(cnt, SELECT_BY_POS)// може SELECT_BY_TICKET?
{
if(OrderProfit()>0)
double pr=OrderProfit();int tik=OrderTicket();
if(OrderProfit()<0)
double pr2=OrderProfit();int tik2=OrderTicket();//тикет показывает один и тот же,как и OrderProfit()>0

}

if((pr-pr2*(-1))>0)

OrderCloseBy(tik,tik2);

Как правильно запрос составить? В результате мне нужно мах профитный ордер (по нескольким парам) и его тикет и и еще проигрышный ордер (по нескольким парам) и его тикет, который мог бы перекрыться выигрышным при одновременном закрытии. Если бред, иль просто ошибка, подскажите, пожалуйста, я в начале пути

 
bestseich:
//Пример: 
for(cnt=0;cnt<total;cnt++)
   {
  if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
      {
    if(OrderProfit()>0)
         { 
        double pr=OrderProfit();
        int    tik=OrderTicket();
        int    Typ1=OrderType();

        if(Typ1==OP_BUY){Typ2=OP_SELL;}  // 
        if(Typ1==OP_SELL){Typ2=OP_BUY;}
        
        for(i=0;i<total;i++)
            {
           if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
               {
              if(OrderType()==Typ2)
                  {
                 if((OrderProfit()+pr)>=0)
                     {
                     // Здесь удаление 2х тикетов  OrderTicket(), и tik.
                     // OrderCloseBy(), не пойдет работает по одному символу.
                     }
                  }
               }
            }
          }
       }
    }

Мысль хоть и бредовая, какая есть.
 
Извиняюсь, може не ясно выразился. Не важно какой ордер BUY иль SELL, не важно какой инструмент,инструменты именно разные, важно "профит+", и "профит-", перебирать по всем инструментам и если "+" перекрывает "-", то два ордера закрываются. Нужны тикеты этих двух ордеров
 
bestseich:
Извиняюсь, може не ясно выразился. Не важно какой ордер BUY иль SELL, не важно какой инструмент,инструменты именно разные, важно "профит+", и "профит-", перебирать по всем инструментам и если "+" перекрывает "-", то два ордера закрываются. Нужны тикеты этих двух ордеров


//Пример: 
for(cnt=0;cnt<total;cnt++)
   {
  if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
      {
    if(OrderProfit()>0)
         { 
        double pr=OrderProfit();
        int    tik=OrderTicket();
        
        for(i=0;i<total;i++)
            {
           if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
               {
               if((OrderProfit()<0)
                  {
                 if((OrderProfit()+pr)>=0)
                     {
                     // Здесь удаление 2х тикетов  OrderTicket(), и tik.
                     // OrderCloseBy(), не пойдет работает по одному символу.
                     }
                  }
               }
            }
          }
       }
    }
 
bestseich:
Хотелось бы знать именно как из разных инструментов, ведь в окне терминала все, что нужно есть, как достать и применить?


OrderSelect(), OrderSymbol() да и OrderMagicNumber(). Всё в документации написано.
 
Ну типичная ошибка. Перебирайте ордера с последнего
for(cnt=OrderTotal()-1;cnt>=0;cnt--)
 
r772ra:



благодарю
 
bestseich:

благодарю

У меня если профит "-", то if (OrderProfit()<5*Lots) т.е. "-" 5 пунктов, а перекрывает профит "+" > на 1 Lots больше, чем "-". Но в настоящее время столкнулся со следующим: в качестве профит "+" хочу наибольший "+" из всех открытых позиций, не важно по каким инструментам, минус подбирается сам, ништяк. А еще лучше, чёб "+" суммировался и перекрывал какой то "-", иль их сумму двумя, иль тремя, иль более, открытыми ордерами с "+"
В настоящее время пока так:
MQL-Код:
for(cnt=0;cnt<total;cnt++)
{
if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
{
if(OrderProfit()>0)
{ 
double pr=OrderProfit();
int   tik=OrderTicket();
        
for(i=0;i<total;i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderProfit()<(-5)*Lots)
{
if((OrderProfit()+pr-Lots)>0)
{// Здесь удаление 2х тикетов  OrderTicket(), и tik.
if(OrderType()==OP_BUY)
OrderClose(OrderTicket(),OrderLots(),Bid,3,White);
OrderClose(tik,OrderLots(),Bid,3,White);

if(OrderType()==OP_SELL)
OrderClose(OrderTicket(),OrderLots(),Ask,3,White);
OrderClose(tik,OrderLots(),Ask,3,White);
}}}}}
Если длинно, то я в начале пути, пока лишь знакомлюсь...
Не.. хочу уточнить. Это просто коментом показывает вновь появившийся "+"-совой ордер, а не больший, а так срабатывает все нормально
Вот еще бы, если нет возможности участия всего лишь 2-ух ордеров, хочется чтоб участвовали по нескольку с обеих сторон, може кому не лень... Не надо частичное закрытие, оставим на потом, просто "+" больше "-" и всё... Покажите свое решение.
 

Есть готовая функция ClosePosBySizeProfitInCurrency - Закрытие тех позиций, у которых профит в валюте депозита некоторое значение

Только определись в чем прибыль считать - в валюте депозита или в пунктах. Если в пунктах, наверное нет смысла размер лота учитывать, просто закрывать тот у которого максимально положительная разница в пунктах.

Набросал, но не тестировал. Я бы так сделал.

#define MAGIC 12345
int slip=30;
void GoodProfit(double prof=50){// prof - Достаточная прибыль в пунктах для закрытия ордера
// закроет ордер с максимальной положительной разницой в пунктах не ниже заданной
 double prl,prs,prlmax=0.0,prsmax=0.0;
 int lt=-1,st=-1;
 for (int i=OrdersTotal()-1;i>=0;i--){
  if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES))continue;
  if(OrderSymbol() !=Symbol())continue;
  if(OrderMagicNumber()!=MAGIC) continue;
  if(OrderType()==OP_BUY) {
   prl=(Bid-OrderOpenPrice())/Point;
   if(prl>prlmax){prlmax=prl;lt=OrderTicket();}// ищем бай с максимальной прибылью в пунктах  и запоминаем его тикет
  }
  if(OrderType()==OP_SELL) {
   prs=(OrderOpenPrice()-Ask)/Point;
   if(prs>prsmax){prsmax=prs;st=OrderTicket();}// ищем селл с максимальной прибылью в пунктах  и запоминаем его тикет
  }
 }
 if(lt>=0 && prlmax>prof && prlmax-prsmax>0){OrderClose(lt,OrderLots(),Bid,slip,Blue);}// Закрываем бай с максимальным профитом в пунктах
 if(st>=0 && prsmax>prof && prsmax-prlmax>0){OrderClose(st,OrderLots(),Ask,slip,Red);}// Закрываем селл с максимальным профитом в пунктах
 return(0);
}
 
Добрый день всем. Подскажите, пожалуйста, как поправить код. Суть: закрытие одним плюсовым ордером одного минусового на разных инструментах
MQL-Код:
for(cnt=0;cnt<total;cnt++)
{
if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
{
if(OrderProfit()>0)
{ 
double pr=OrderProfit();
int   tik=OrderTicket();
        
for(i=0;i<total;i++)//total=OrdersTotal()
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderProfit()<(-5)*Lots)//Lots=OrderLots()
{
if((OrderProfit()+pr-Lots)>0)
{// Здесь удаление 2х тикетов  OrderTicket(), и tik.
//А на самом деле вместо 2-х тикетов удаляются 1 плюсовой и
// все минусовые подходящие под условие, в итоге вместо плюса получается общий минус
if(OrderType()==OP_BUY)//може здесь сыграют фигурные скобки? хотя... не совсем понятно...  наверно ещё нужен break? у меня нет мультивалютного тестера
OrderClose(OrderTicket(),OrderLots(),Bid,3,White);
OrderClose(tik,OrderLots(),Bid,3,White);

if(OrderType()==OP_SELL)
OrderClose(OrderTicket(),OrderLots(),Ask,3,White);
OrderClose(tik,OrderLots(),Ask,3,White);
}}}}}}}
нужен какой тормоз во втором цикле
Причина обращения: