Questions and answers about EA using martingale method

 
// Khai báo toàn cục về rủi ro và số tiền thua lỗi 
double Risk_amount = 10.0 ; // Khởi tạo với giá trị mặc định 
gấp đôi Last_loss_amount = 0 ; // Biến lưu số tiền bị lỗi

void Tính toán Rủi ro ()
{
    // Choose toàn bộ lịch sử giao dịch 
    if ( HistorySelect ( 0 , TimeCurrent ()))
    {
        int ClosedOrdersCount = HistoryOrdersTotal (); // Tổng số lệnh đã đóng 
        Print ( "Số lệnh đã đóng: " , closeOrdersCount);
        
        nếu (closedOrdersCount > 0 )
        {
            gấp đôi Last_order_profit = 0,0 ; // Khởi tạo biến lợi nhuận 
            ulong Last_order_ticket = 0 ; // Khởi tạo vé lưu biến
            
            // Duyệt qua các lệnh đã đóng từ lệnh gần nhất đến lệnh xa nhất 
            for ( int i = 0 ; i < closeOrdersCount; i++)
            {
                // Choose command thứ i từ cuối danh sách 
                if ( HistoryOrderSelect (closedOrdersCount - 1 - i))
                {
                    // Lấy ticket của lệnh 
                    last_order_ticket = HistoryOrderGetInteger (closedOrdersCount - 1 , ORDER_TICKET );
                    
                    // Thu lợi nhuận từ lệnh 
                    Last_order_profit = HistoryDealGetDouble (last_order_ticket, DEAL_PROFIT );
                     Print ( "Lợi nhuận thứ cấp " , i + 1 , ": " , Last_order_profit);
                    
                    // Bỏ qua lệnh có lợi nhuận bằng 0 
                    if (last_order_profit == 0 )
                    {
                        Tiếp tục ; // Move to the next command
                    }

                    // Nếu có lợi nhuận khác 0, thoát khỏi 
                    break vòng lặp ;
                }
            }

            // Kiểm tra lợi nhuận có giá trị của lệnh 
            if (last_order_profit < - 1 )
            {
                Last_loss_amount = MathAbs (last_order_profit); // Lấy giá trị tuyệt đối của số lỗi 
                Risk_amount = Last_loss_amount * martingale_multiplier; // Áp dụng Martingale 
                Print ( " Cập nhật Risk_amount: " , Risk_amount, " with martingale_multiplier: " , martingale_multiplier);
            }
            nếu không thì  nếu (last_order_profit > 1 )
            {
                // Nếu lệnh có lợi nhuận, hãy đặt lại Risk_amount về mức cố định 
                Risk_amount = 10,0 ; // Có thể thay đổi thành giá trị mong muốn 
                Print ( "Reset Risk_amount khoảng 10" );
            }
            khác 
            {
                Print ( "Không có lệnh nào có lợi nhuận hoặc lỗi để cập nhật Risk_amount." );
            }
        }
        khác
        {
            Print ( "Không có lệnh nào được đóng trong lịch sử." );
        }
    }
}

//+------------------------------------------------------- -------------------+ 
//| Hàm thực thi lệnh theo từng dấu tích | 
//+------------------------------------------------------- -------------------+ 
void  OnTick ()
{

    // Kiểm tra xem có đủ số lượng đề xuất để tính toán hay không 
    int bar = iBars ( NULL , 0 ); 
     nếu (thanh < sma_length + max_bars_b Before_cancel + 1 )
    {
        trở lại ;
    }

    // Lấy thời gian của mô hình tại 
    datetime current_time = iTime ( NULL , 0 , 0 );

    // Kiểm tra xem mô thuyết mới đã bắt đầu hay chưa 
    if (current_time != Last_time)
    {
        thời gian cuối cùng = thời gian hiện tại;
        order_placed = sai ; // Đặt lại cờ khi bắt đầu đề xuất mới
    }

    // Lấy dữ liệu của các mô hình 
    n1_open = iOpen ( NULL , 0 , 1 );
    n1_close = iĐóng ( NULL , 0 , 1 );
    n1_low = iLow ( NULL , 0 , 1 );
    n1_high = iHigh ( NULL , 0 , 1 );

    n2_low = iThấp ( NULL , 0 , 2 );
    n2_close = iĐóng ( NULL , 0 , 2 );
    n2_open = iOpen ( NULL , 0 , 2 );
    n2_high = iHigh ( NULL , 0 , 2 );

    n3_low = iLow ( NULL , 0 , 3 );
    n3_close = iĐóng ( NULL , 0 , 3 );
    n3_open = iOpen ( NULL , 0 , 3 );
    n3_high = iHigh ( NULL , 0 , 3 );

    n4_low = iLow ( NULL , 0 , 4 );
    n4_close = iĐóng ( NULL , 0 , 4 );
    n4_open = iOpen ( NULL , 0 , 4 );
    n4_high = iHigh ( NULL , 0 , 4 );

    // Toán tử SMA 
    double sma_buffer[];
     if ( CopyBuffer (sma_handle, 0 , 0 , sma_length + 1 , sma_buffer) <= 0 )
    {
        Print ( "Không thể lấy dữ liệu SMA" );
         trở lại ;
    }
   
    sma_current đôi = sma_buffer[ 0 ];
     sma_previous đôi = sma_buffer[ 1 ];
   
    bool price_trend_down = sma_current < sma_previous;

    // Định nghĩa điều kiện bán
    condition_sell = giá_xu_hướng_giảm &&
                     n1_đóng < n1_mở && n1_cao < n2_cao &&
                     n2_đóng > n2_mở && n2_cao < n3_cao &&
                     n3_đóng < n3_mở &&
                     n4_đóng < n4_mở;
    // Gọi cập nhật chức năng Risk_amount
    Tính toán số tiền rủi ro();    
    // If có điều kiện bán và chưa có lệnh nào được đặt 
    if (condition_sell && !order_placed)
    {
        // Tính toán theo lệnh, dừng lỗi và chốt 
        entry_level = (n1_high + n1_low) / 2 ;
        stop_loss_level = n2_high + 2 ; // Cài đặt ban đầu lỗi dừng
        mức_chốt_lợi_nhuận = mức_vào_cửa - (mức_dừng_lỗ - mức_vào_cửa);

        // Tính toán khoảng cách dừng lỗi 
        double stop_loss_distance = MathAbs (stop_loss_level - entry_level);

        // Tính khối lượng giao dịch 
        double lot_size_calcated =risk_amount / stop_loss_distance/ 100 ; // Đảm bảo kích thước lô được tính toán 
          // Cập nhật lại trạng thái đặt lệnh 
        order_placed = true ;
         // Gửi lệnh bán giới hạn 
        ZeroMemory (yêu cầu);
        request.action = GIAO_CHUYỂN_HÀNH_ĐANG_ĐANG_XỬ_LẠI ;
        request.symbol = Biểu tượng ();
        request.volume = NormalizeDouble (lot_size_calculated, 2 );
        yêu cầu.type = ORDER_TYPE_SELL_LIMIT ;
        request.price = NormalizeDouble (entry_level, _Digits );
        request.sl = NormalizeDouble (mức dừng lỗ, _Digits );
        request.tp = NormalizeDouble (take_profit_level, _Digits );
        yêu cầu.độ lệch = 3 ;
        yêu cầu.magic = 0 ;
        request.comment = "Lệnh giới hạn bán" ;
        yêu cầu.type_filling = ORDER_FILLING_FOK ;

     

I am creating a trading EA based on the martingale method. However, the following order is not being calculated according to martingale to offset the loss from the previous order. I would greatly appreciate your help, as there seems to be an error in my EA. Thanks !




            
Files:
 
Ever Resol:

I am creating a trading EA based on the martingale method. However, the following order is not being calculated according to martingale to offset the loss from the previous order. I would greatly appreciate your help, as there seems to be an error in my EA. Thanks !



You need to write in English on this forum if you need help. What is the subject of your topic ? Please change it.