포럼을 어지럽히 지 않도록 모든 초보자 질문. 프로, 놓치지 마세요. 너 없이는 아무데도 - 6. - 페이지 75

 
MisterD :
안녕하세요, 다음 코드에서 오류가 어디에 있는지 알려주십시오.
나는 순간 루프를 "deinit"이라고 부릅니다.
마지막 주문을 제외한 모든 주문이 삭제됩니다.
오류가 이 줄에 있을 가능성이 가장 높다는 것을 이해합니다. >> for (int i=1; i<=OrdersTotal(); i++) <<
그러나 모든 것이 논리적으로 올바른 것 같습니다 ... 내가 놓친 것은 무엇입니까?
미리 감사드립니다!


역주기

 //-------------------------------------------------------------------------------------------
for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--)
{
   if ( OrderSelect (i,SELECT_BY_POS)== true )
   {
       int Type=OrderType();
       if (OrderSymbol()!= Symbol () || Type < 2 ) continue ;
       int Ticket=OrderTicket();
       bool Modify =OrderDelete(Ticket);
       if (Modify == true ) Alert ( "Ордер Удалён" ); continue ;
       if (Modify != true ) Alert ( "Удаление ордера не удалась" );
   }
} 
//-------------------------------------------------------------------------------------------
 
MisterD :
안녕하세요, 다음 코드에서 오류가 어디에 있는지 알려주십시오.
나는 순간 루프를 "deinit"라고 부릅니다.
마지막 주문을 제외한 모든 주문이 삭제됩니다.
오류가 이 줄에 있을 가능성이 가장 높다는 것을 이해합니다. >> for (int i=1; i<=OrdersTotal(); i++) <<
그러나 모든 것이 논리적으로 올바른 것 같습니다 ... 내가 놓친 것은 무엇입니까?
미리 감사드립니다!

//------------------------------------------------ --------------------------------------------------
for (int i=1; i<=OrdersTotal(); i++)
{
if (OrderSelect(i-1,SELECT_BY_POS)==true)
{
intType=주문형();
if (OrderSymbol()!= Symbol() || 유형 <2)계속;
int 티켓=OrderTicket();
bool 수정 =OrderDelete(티켓);
if (수정 == true) 경고("주문 삭제됨");계속;
if (수정 != true) Alert("주문 삭제 실패");
계속하다;
}
}
//------------------------------------------------ --------------------------------------------------


다음과 같이 시도하십시오.

 for ( int i= OrdersTotal ()- 1 ;i>= 0 ;i--) {
   if ( OrderSelect (i,......................
 

좋은 오후에요. 도움이 좀 필요한데 수익이 가장 많이 나는 로트를 청산하는 기능이 있습니다.

이 일을 마무리해야합니다

사용 방법을 알려주세요. 예를 들어 계정 자산이 5포인트 이상인 경우 기능이 작동해야 합니다.

 void ClosePosWithMaxProfitInCurrency( string sy= "" , int op=- 1 , int mn=- 1 ) {
   double pr= 0 ;
   int     i, k= OrdersTotal (), np=- 1 ;

   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 (mn< 0 || OrderMagicNumber()==mn) {
           if (pr<OrderProfit()+OrderSwap()) {
            pr=OrderProfit()+OrderSwap();
            np=i;
          }
        }
      }
    }
  }
   if (np>= 0 ) {
     if ( OrderSelect (np, SELECT_BY_POS, MODE_TRADES)) {
      ClosePosBySelect();
    }
  } 

}

 
sannin :

좋은 오후에요. 도움이 좀 필요한데 수익이 가장 많이 나는 로트를 청산하는 기능이 있습니다.

이 일을 마무리해야합니다

사용 방법을 알려주세요. 예를 들어 계정 자산이 5포인트 이상인 경우 기능이 작동해야 합니다.

5점(4개 기호) - 3-4개 이상의 주문 이 있는 실제 시장에서는 쉽게 (삭제 결과에 따라) 마이너스로 바뀝니다. :)))

추신: 제가 알기로는 기성품 코드가 필요하지만 그런 문제를 풀기 위한 알고리즘이 소용이 없는 건가요?!

 
TarasBY :
5점(4자리) - 3~4개 이상의 주문이 있는 실제 시장에서는 (삭제 결과에 따라) 쉽게 마이너스로 바뀝니다. :)))


글쎄, 예를 들어 나는 .. 네, 그리고 최근에 금에주의를 기울였습니다 .. 생각만큼 빨리 반응하지 않습니다

아직 이 형태의 함수로 작업을 해보지 않아서 .. 지원을 요청합니다.

 
좋은 오후 입니다. 고문의 개발에 문제가 있었습니다. 조건이 표시기에 의해 마감을 나타내더라도 주문을 마감하지 않습니다. 무엇이 잘못되었는지 설명하십시오. 미리 감사합니다.
파일:
 
sannin :


글쎄, 예를 들어 나는 .. 네, 그리고 최근에 금에주의를 기울였습니다 .. 생각만큼 빨리 반응하지 않습니다

아직 이 형태의 함수로 작업한 적이 없어서 .. 지원을 요청합니다.

먼저, 상품의 총 포지션의 BU 라인을 계산합니다(수익성에 도달했을 때 주문 마감 조건을 포인트 단위로 결정하기 위한 것입니다):

 //IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Автор : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Определение Уровня БезУбытка по символу                                    |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double fGet_BreakEven ( string fs_Symbol,     // Symbol
                       double fd_DeltaLots,   // разность объемов ордеров Buy и Sell
                       double fd_Profit)     // текущий профит по открытым ордера
{
     if (fd_DeltaLots == 0 .) return ( 0 .);
     double ld_BU = 0 ., ld_tickvalue = MarketInfo (fs_Symbol, MODE_TICKVALUE);   // цена одного пункта
//----
     //---- Уровень общего безубытка для открытых ордеров
     if (fd_DeltaLots > 0 .) ld_BU = MarketInfo (fs_Symbol, MODE_BID) - (fd_Profit / (ld_tickvalue * fd_DeltaLots)) * MarketInfo (fs_Symbol, MODE_POINT);
     else if (fd_DeltaLots < 0 .) ld_BU = MarketInfo (fs_Symbol, MODE_ASK) - (fd_Profit / (ld_tickvalue * fd_DeltaLots)) * MarketInfo (fs_Symbol, MODE_POINT);
//----
     return (ld_BU);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+

그런 다음 현재 가격과 손익분기점의 차이를 계산하고 "차이가 맞다면" 주문 삭제 절차를 진행합니다. 첫째, 가장 수익성이 높은/잃는 주문의 티켓에 대한 검색 기능:

 //IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Автор : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//         Получаем Тикет самого прибыльного/убыточного ордера                        |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int fGet_TicketWithControlProfit ( string fs_Symbol = "" ,   // Инструмент
                                  int fi_Magic = - 1 ,       // Magic
                                   int fi_Type = - 1 ,       // OrderType
                                  int fi_TypeProfit = 0 )   // Профитность ордера среди остальных ордеров:
                                                          // >= 0 -  с самым большим профитом;
                                                          // < 0 - самый убыточный
{
     double ld_Profit = 0 ., ld_curProfit;
     int     li_Total = OrdersTotal (), li_Ticket = - 1 ;
//----
     if (fs_Symbol == "" ) fs_Symbol = Symbol ();
    if (fi_TypeProfit < 0 ) ld_Profit = 10000000000. ;
     for ( int i = li_Total - 1 ; i >= 0 ; i--)
    {
         if (! OrderSelect (i, SELECT_BY_POS, MODE_TRADES)) continue ;
         if (OrderSymbol() != fs_Symbol) continue ;
         if (fi_Magic > - 1 ) if (OrderMagicNumber() != fi_Magic) continue ;
        if (fi_Type > - 1 ) if (OrderType() != fi_Type) continue ;
        if (fi_Type > 1 ) continue ;
        ld_curProfit = OrderProfit() + OrderSwap() + OrderCommission();
         if (fi_TypeProfit >= 0 ) { if (ld_Profit <= ld_curProfit) continue ;}
        else if (ld_Profit >= ld_curProfit) continue ;
        ld_Profit = ld_curProfit;
        li_Ticket = OrderTicket();
    }
//----
     return (li_Ticket);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+

제거는 양방향으로 정렬할 수 있습니다. 삭제:

 //IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Автор : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Функция закрытия "своих" ордеров по признаку                               |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int fClose_AllOrdersByProfit ( string fs_Symbol = "" ,   // Инструмент
                              int fi_Magic = - 1 ,       // Magic
                               int fi_Type = - 1 ,       // OrderType
                              int fi_TypeProfit = 0 )   // Направление закрытия ордеро по профитности:
                                                      // >= 0 - начиная от самого большого профита;
                                                      // < 0 - начиная от самого маленького профита;
{
     int li_Ticket = fGet_TicketWithControlProfit (fs_Symbol, fi_Magic, fi_Type, fi_TypeProfit),
        li_cnt = 0 ;
//----
     while (li_Ticket > 0 )
    {
         //---- Здесь вставите свою процедуру закрытия 
         //---- что-то типа:
         //ClosePosByTicket (li_Ticket);
         li_Ticket = fGet_TicketWithControlProfit (fs_Symbol, fi_Magic, fi_Type, fi_TypeProfit);
         li_cnt++;
    }
//----
     return (li_cnt);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+

필요한 단위를 더 조립하는 것은 어렵지 않습니다. 마스터하거나 작업 에 가야합니다 ... :)

 
변수에 가격 값을 할당하고 싶습니다.

a=( NormalizeDouble (OrderOpenPrice(), 5 ));


그러나 어떤 이유로 가격은 유로 1.3360의 네 자리 숫자로 표시됩니다.

오류를 제안?
 
lottamer :
변수에 가격 값을 할당하고 싶습니다.



그러나 어떤 이유로 가격은 유로 1.3360의 네 자리 숫자로 표시됩니다.

오류를 제안?

DC는 4자리 숫자인가요? 또는 DoubleToStr(YourPrice,5) 없이 가격을 표시하십시오.
 
Sepulca :

DC는 4자리 숫자인가요? 또는 DoubleToStr(YourPrice,5) 없이 가격을 표시하십시오.


DC 5자리...

WITHOUT DoubleToStr(YourPrice,5)은(는) 무슨 뜻인가요? 어디에도 DoubleToStr(YourPrice,5)이 없었습니다.