0011011100101001101000011110011100101110101101010111101001110001000111110011011000100101101000010010011011110010000111100010010100000111100000110101100000101010101111000001011110010010110110111000100100011011000110111011011000101001011100110100000000010111000110100001001000101010111100110100101001111110101001001010010111001110111101010100111111101010101111100110010010011100101010110010011001100001 0110000101110000001010011101111000010001000100011110101011011011110010101111000111110001001011111001110110111000101000011001011001110010111011110010000011111011111110110011010001101000110101010100110110010111010000101011010100011100101100111101001000111011000111100010001100111110111011010111011111011100100111101111111110010001101100111001001110100001111111101100111111001110000100111001000000111000 0000011100111101110011101000001101100000011000010000111001110101101100101001100111011110110011101101000101101001101000110010101001101000101000001000101000011000101000000111111110001111101001011010101100001100011011001111000011000111010010010101100100011011010100011101111110011101010100001111011110101100010001111100011001100011111100010010100101100001001001010100000101101000101111110001111110000100 1101100110110000111011101101001000000110010111101011111000101000000000110111001101001000101110000000001010001011000101101000001110111101100111001101011001000010110001010101010001011111110100100010110111100110001110111110011010011111001111111001100011000000001101111111100000101101010110101110011011100100111000100110001010011101100100011011011101111011001101011110011101111111000110000110001011101011 1000000011010101010110110010010010110000101110000010000110101001001100011011010001110011101000011001100110100100010011000000010011010011001010010001111100111011110101110111100000000100000101100010001111100001100110101000100111110001111100010101110000100011010100101001001001101111100110010100100111010001100111101111101000110000001010000101110111001011111110111011111010000111001011111100000010110010 0000010100100111000000011101000100011111011111100001100111111010011001100001101011100010011001011010000101011011011110001010100101110010100111000101110010011111110000111100100000111110101100001111100010101001001110111000110000111101001001111100101111001001001110000000111100010111100110001110111111001110111010010001001100001001000011101101011110011011011011000001010111011001110110010100001100111110 1011111111011001101010101110001010000011010110111011101011000110011011101010110011110000111101011000110001111000111100001001101011100101011010100110100001100001010011111001010110011100010010000001011011110111110000100111011100111100001101011100100000100111111011011010000101111101011110101111100111110011010101000010001110000110100101100101110000101001011100000010110111001111001011100011011101111001 0100010100100010010100101001010101111000000101101011000111101101111110111001110111110001111100111110000111011011011111100010101000110001110100111110100111010101100101110011000001101111111001110111100001000011000101011000100111101111010001001010100111000010000000101000001110000000100110001000000101001110001111111011010110010001011001101101111000111001100010011101111011100100011001011110110111011001 0110000101110100111110111010111101110010110000111100001110000100110001011010000110101000101000010110101110001110110001011000000010101000001100101110110000101111011100110010111111001010011000110010001011010110101111011010110001011100010000010010111000101101101011111111100011011011011101100100110000011101110000010000101000110111101110010011001001000100100110110100111100001001011101010011101010011011 0100100010101110111101001010000000110001100011101111110110000100100101110011111101001101010010110010010011001100111000000001010110111001011111000000110110100110100011000100111110011101101010011001110010000110000000100011110100011101110110111001110111111000011010011110111111011000111100010100101100001011110111110001101100001000000110110100110100110011010110111110010010101000111110100011011100010010 0111110110110101000011000110001001000101111001110110100111111101101111010111001000011111001101010011001000000101010001111110101101011010111101000101110000100000010110110111000101100100010100000001011110000011101011011110011011001000000001011011001101111100001110011011000001101110011010101000110110011010111111001110000101011000110111001011000011110001101011011110101001000110100000111001101001110100 1111100101101110101001111010110110011011111110100011011111110010010001110010100000101011110110011001110000011010111100110110010010101000010011100100110100100111100001100100001000010010100111010101100010001100101011110010011110101011101111000100101110110110011111010110110101110100101011100000110000000111010011101001110010010010111101100011001101010110000101001100001010011110110101000110010001010011 1001001011001000100111100000010000111011011011110100111100001011010001110111010111111111101111000110101010011010101111111111111111000111010000111010110001000111101011011001100100001001100011001011010011011100011000000100100011101011111101011100110000000111111101001110110100111000000100011100101010011101100000110100101110011100000100001101001000111011010001100111010010010010010110101110001000100001 0101110110001100111001000111011000010110010110100110110101000110010011001010001100111101110010101101010101110000001101000001001011110000101011111001111101110110010110111110101000001010010011100110111100010010010101111000010110101001100110001011100011000001100001000001000011001100000011100001001110111100010001011000011111001111110000000001101001100010110010001101000110101010111001100110100111001100 1000110011011011001010011011001100011111100010100011010101001000111001101100001100010010101101101001101111101111101000100100111001100111010111101111101011000010011001010010000001001110101100110010000101011001101101110001000101110000110111000101100000011111110001011111000011011111100100000010011101100101101111101100110111001011010010100001001000100010010000101001111100101010100000011111110001000011 0111001111011011010100010000110101101100110001011100010110000001100100011011010011111000100001001111100000010111000010111100001010111011111100001111110101011001010001011000111101001100111010100111010101110000011000000110111101110000110111011111010010010001101011101011000110101001011111100110000010011010110011110011111001000000011010100111100001000010111000011110011101001100000001001011000111000010 0010100101100001100110110000011110110011101011101110101011110110000011110110111110110101101100111010001100100011101011101010101110001010000011101110101011011111100001110010101000001001110110001110110101001101010010110111111001101100000100011001011000101101010011100011001001111011111000001000100100001110111000101000010101100111110001010111001011010101101110110010101101001111000001101100011110011111 1010010000110011101011010111011000110011010111010010110000101100010101111001111010101010001101100101010000000111110111011110001110011111010101011011011101001000000001101110110111011111010001100111001000011010011100100010011011110001111101011110111011101000000110101010000110110101011110110101001101101111100000011110011001110100100010100011110111101101100000101110101101010111011011111111011010010100 1110010001101100110000001010101001100000110010011010010110010010111111101110000110010011101000011010111010111010000001001001010101100001000110000100001000111000111000110111101100001001000111100100111111010101001111011111001101011010001101011111000110011110011110010011100111001000010000110110101000110111001110100000100010011100011101100001100110101111000010000001000000001001000100100101011101111100 0100010110000000010001101001111011111111000100010111111111101000100100101000101010100001011111010001001000000110110100011101001011101110000100001111100101101100000111111010001001011001111111111101001100001000100100000000001011011011110101110110111001010000111110100100111011100101101011100010011010100110010001011100011111011000100111110011011111101111011100101101001010101000111101000000001100010100 1011101100001001001110001011000111000010111000111010111000110101001101101001010111100011000011010111011110000011111101100111011000010111110101010101101101010001011001100110110100000100101000010101010011111010100110011111001111100000111111111101101011101110110001101000111100000110100000110000110110111101011110111001001001111100011001100101101011110111100111110111101101100000111100000010100011100101 0110000100101111101101000000010110110110001100001101001111011001011000110000100010001011000011101101001010001000100001000111011011110011101011001000111110001000001111000111011101100110001110001011011011011001110110011110101010111110111111001011101111001101000010010100111110111000111010000011100011011000110110110001000110111101000000000111111000110010100000111110111000001110110010110011111101101111 0001001100101011110001100011010100101100001001100000101000010110110001011010110001000110010110101000010011100000110111101011000101110000110001110000111010010010001011100111011101010110001111011110100101000101000101000000100110100110000111000011100010100011000100111010110011111010010101000010001111100001111101010011001011100011110000100100011110010011100001000010100001001100011100111101000110101000 0111001010010000010001101011010011101001100100110011010010011101111101001100101011010111011011100001101100000010110100110011011000111000011000010111011001000111010101101010001100111101000111101111001010011000001011001010010010011001101001111011001010010010110001001001000000100001000001011110110111000001100011110111101000010111010100110000100001100001100101101101001111010011001010000111010101011101 0110001011101111111010010100000111011101100100010100001010110001100000101110001001111100111010111111011001111100111010000000100010111011010110100100100111100110110111101100110011001010101100110101110011111100010110001001100100000111110000101001100100110010001111101110000100001100001111011000001011010000001011111111010000000000100011101110100111110001000110010010001000101101011111011001111011011001 0110110110101110011011100001001100101110110111110111101001111111111000110000010111100011011000101000111110010110111000011110011100011000101010011100001111100011000001101011011010001011000100011010111110000111100010110011000110001001010011010010101011101010110001011100010010001100001010000100000010010010111010011000111011111011011000010010001100110000101001101000011000001100010011101010111111100010 1100110001111011100101011010000001110111001110010100011011100110000110101010111010100101110110001111010100101111100000000100110011000110101111100110110010101110110100011011101010001111011010011010001110010111110111000000010000111001111110111101011001010011100011011011011010011111010001111101001111110010000100000001101001100001011110011001111001110101001000011010001110010001111010100000001101111101 0001110011001010111100011110101001001001101100000011010100111110111001100101101010010100001111110001001011110110100110101000001110010111010001111001000111100101011111000100010100010010110111110110110110110011010010001101111010010010110101111011001100001000111110100000100110001110101011101011100000111011010111100011001010010100010101000011001010010010100100111101110110001001011100111110000110101111 0000011010000101001101000001100110010101011100000110001001001000101101001100111010011110000011000101100110001100100111100011001011000110100010100000100010010110100101100111010001110000010011011011010000001100010110110010000011010000111100011111011000001000000101111011010001111101000110010010111110001110000001001000110000001101000010110000010101000000101010101110011101011001100110101001101010111101 0000000010111101111011010000101100100000001111111001100111101000001010010101111111001101011011100011111000001101010010010110100111100011001011001010010000000001010100100110101101001001000001001001110011010101011001110110101010111001011100101001101110010110001110010001100011010000111100010000111111101111000101101001110100010101001010000100111111000000100001111000101010111000101011100110000101100110 0001011110111111101010100010110000101001101010110100101111101111011001100000101010011111001100010001011001010010000111000001101101010001110010010100110110011100001110010111110001101110100110001111010111110010110001000000001001100010111111110000111011111011111001111001000010111000001101010001011100001101010100100011010000011011011010100100001101010101001000001011101110000010001011000101000110101010 0001010101011111101011100001100111110011111001110100000101001001110000100101110011111110101101110111000110101010010111111110101110011110010001110111110111000001000100110100001111101000100001000010101011011100001100100011101110111100101111101101100100111000111001101101010101011000001111110011011001001011011001110000010001011110111110011100001000101010100000011000000101110111111110000011001111000001 1001010001111000011100101011100000110110101001110001010100000101010011010100000010101100100110101110000101011111110010000101111011010001101001101101010101011010100100001101010101011100111000110110100100000100100001110011001000011000110010111100101000011000101111010100101100001111101000100110110000010010011101000101011011001110000011001110000010000001010110011011101101110111101110000010010110101000 1110010111000101110100111111001010110011010110100000010001110010110011110000001010011010010011010010011101111100000010010000000111000011010101110010000000010000111101011000100100100111011000100111011101010100011101000010010110110110100100100101010000110010110001001110111111110110110000001100101010111000001101110101101011101111001111100001111111011110010011000111010011100010101001010100011010000011 0101111100011100001110011111101100110101010110011011101100001000101100111001011001001001100100011100011010000100001010000001100000110001011100111011101011101100111101101010001111011100111011111101101100010101101000010001001000100001110010000100001010100011110110011000001011010011000001111111100111001111001010000111100001010110000100111011110011010111001010000011100000011010011101111010010010010010 1110111000101011110000001100010011000010110011000110110001111111001011110001011110110110101111111110011110001000010100001011101110111011111011001010111011000000101010101001100011111110111110000011000100000110110000011111000011001011111100111010110100011100011100001101000001011101101110001000001110000100011000100101111001111010000110000010011011011000110011110110010001000011000011011110010000100001 1100011101000010000001100110111010000010101000001011001010011000011101100010101001110010000010100000100100111101111001100101111110101000100100100100111000011011110110010001000011011111001010100011000011000010110111101110010001101010011011101001001011000110001101111101011100111000111101010100100111101111101010101110110001001000001000111000101101101010010010000110011101001000111010110100101101101111 1110000101101000111010001010110010111001000111110001111010100100110001110000011001110001011010100010111100110111111011001001001111001000010011011101011110001001000111000101001010101110010110011110111011100000101000111011111010010011011010111011100011101011011101010001110001000011110011011001001110001000001011110001100001111000100101011101101001100101111100010010101010101010001010100010001010101010 0001000110110110111111110011011000011010001110111000001101110111001001111110001011000111101101011110100010000001010111001101100011111111101101100111000101101011000110111011111111111000101000010111010110000101110010010000010100011001101110101011000110100011111111000000101110110111011110011001000101001000111010100110100000101010111111000101111100010000001010100000101010100101110001010101101100010110 1011101001001100010001111111111001001101100010011110001011111001110010101111000001010100111001100100000110010111101111010101000001111101110101100010100110111100000111001100110100100101001010001101000010010110111110101100110001001110100010001000111000111011000000010010010010011111010100000110000101001111101000000000100111001101011011111001111111101010010101000101110001110010100110110001001010011110 1001011001101110010101110101001010111110011101000010011000100110101100001111110111011101010101111001010110110100111110010001110111101101011000000001101000000100101000011111100001001111010101011100111000110111000100111101001100001100000011110000010011010000100000000101110000001111110111101111001000000100111010111101010001111000100100110001001011011000101001001100110000111011111001000110110000010000 0011001011000110111010101110011111010001011100000110111000111101111100010111001111011101111110110000100010000011000001101111110101110011100100011011111110111010101101001100000010000000100100100000101000001101001100000111100100000101110111011101110010001000101110011000001010001000000011111011011011111001101001010000111001000010110111101000101110111110010010111000110111111111111011111100101100000111 0101100111100100000010010001001000000001110010101010000110000011101110011100010011111100001101000011000000111111010111010011110111111001110100010110111101011100101110110110110111101011010110010101011011000011000011100001110101000000010000011100111100010101110110100100110011000100100010000010110010000100001100101001011111001010000100000110011010101101011111010011100010001011000000101100011111100010 0010010001000001101111101001011011001011111111001110101010011100010010101111101011000101100000011010001010010010010110101100110000001111101110011010111101011111110000110101000011100101110001101000101101111010101001010101101110000111110111000100110000100101001110110101111010111111110010000011110111101000111000001010101101011010001110110001010110100000111011100001011100100100100001100101011110000111 0001101101110000111100011000000111101011100010001001001101100111000010001011111111110010000101000100110100010100110011101110000111101100010001011011010100001111110101101010010101110010010111101011001000010100000111001011101101110011001110011111010100101000010010100111101101001110110000011000110100000000010110001101110001101010100001110100000101000100110010000000100101111010000011000111001111000011 0010110100010101011101000000010011000000101110100100001001011110110010011110000011111000111101110100110011110010010111111000101101010101011000111010011100011011101010011111111100111010100110011100011111100110001000010011111110101011111001101100100110101001000101010100111000101110011101100100010100110101010111111100101011010110010111101100010011001110100000100000010100000111111011001001101000000000 0010111101000101111010010001110011101000100011000111010001100010111101111000111001111010101001111101011010010101101100101001100101110100110101010110011100000010110110100111110101101001111111101001110101100101001110011001010000101001100100011001111111000000101001001101100101100001101110011010111011101101001111111110100100000100110110101110111110001111001111000001111000011011000101000010100010110011 0101011000111001111100001001100110010011011001001001101100101111100100101010000100000010110111110001110011110001000001011011011010000010110010101001101101101100001101000101010100011100000001010001111001011111101110111010110100000111111110000111011101111011111110100111010101100111101110110100110101110000110110111000101100100100011010011001000000101000110001000000100100001100111000111010011101100011 1111100000000100110100011011000011110111010000011110110101010011110100101101100000000110001110110111011001111110101000010110001110001001110110111000001101110100001101100001111000010110111101001000100111001101101011101011011001100110001101100100110101101001011100011011100111001010000010010100111111100010111100011010100011111010011110111101111001100111011011011101101001000011011010111110000001110011 1000110100101110110011110001011110010110011100011000101000011011010111000001001011000101110111111110111100110100101100010111001110100000111010101000101100111100001010110110000010100110110011001111001110001001110001010010010011111011000000000100001110100101011100101110100100010101011111011110111111110111101000010010001110101000010000110101010001000001110100011001101000001111100111101101110000000000 0100110001011100000111100111111110010101100101000010101101011001010001111101010011011101001010010110001000011110000011111000011101011111000100000001001101110001101110000111110001101001011001101001011010100100011010000000100110111101000100011001010111000111000100101011001000111010111101000010110000110100100010111110101110100000100111101000110011111000001111001110010111100100110001101101001011110111 1000101010011100101011101111110100111001010110111010111110011000110111001001010011110000100011000011000110110000110010100001111101110011001011100011101100010100001101110110000000011110110010011101001111110010011110110110100101000010100100101101101001011010011110000101100111010010011110000001001000011100101101100111000000010001001001011111100111101010001011110101000010001100011110100101000101100110 1000011100000000100000111000111000101011100110111011010010100001011110011110001110110100011101001101101101110001001010001010000000111110011100111101010011111010110101111000011000110100001000111110101100000101110110100000010100111011010101000100001010110011110100100101000011110101011000111100001001001111001010011100000000111011010001000100111001111101001111000111011010001001010001110001111000111110 0111110000010011110110111010011101011100110000111111010101011001001010100000101111001101011100000000010111101100100110111001110011001111010001001000010000110111111011010000000101000011011100100010001101110110000011100000100010101111000101101110110111110000001001111110111111111110000101011110010000110011110001001100100011100001110101010011110000111000010100011101011011000101110100000010111110100000 0110000000100000001101100100110110011100000111110100001010011011100101010010001010001001010101111100000101010001110110011010111001100010000100000010001011111010101100111100111010011101001001011010001010100111010011001001001000110111101110011000011101111000000100010100011111101000001000001111010101000100001010101111001111100011001110000010110101100100110000110001010111010010101101001101101111110101 0000011000001100101101001010010010110100000010010100011001110001111001001001001101111010100001100011111001011010100110011011100110010111010100010110001100000000001101101001100000000001111000110010010110010111000110000110010001000010101010000010101011110010101111101110000111011001110101111110100001010010100001000110010100111111001001101101000011101111100100011000010100011011110101010010000010011011 1011110000110101110110110001001111001000100001110111011100101000011111101101110100011001001101111100010110011011001111110100010100100011001000000001000011110001001100100011110110100111100011110001001110101011101100110101101010011000101100001001011110000111101000100100110010010010001010011110001101010110011111001011110110110110001011000101001010101010011010100001001010101000110100000110100111001110 1001001110101011100111111001001001101110110100010010001100101000110000100101001011000100111011001111101111010010111110111101011010101000111111010011101101111010001001100101100010011110010010100011001000101001101000001011111011101000010101101111110111011001100011101001100001111110000010111111111101100101110001110011100000011011010110111001011001101100000101010110001010010010000000001011111000110101 0010111000110001010110001001100011100011101111101101001001011100101001111110000000101100100011100011111101001010010011010111100100110101011001100101111101011101110010001110011000010111011100111010111001100100110001101100010000110000010001101001000101001101110011001000010111011001011100001111010110111110000001111110000101110010111000001010001010000001001010000100001000100000111111100100110111100010 0011101111001011110010110011110110101111001000001101011011010010110101001001101111011011010000110100011010111100101110100100000000100001110110000100100011011011111101011011101100101111100000111001001011101000011111001101010000101101110111101101110000110101110011100100110001111101010100010111011111011101010110101010110111000001111001000111001010100110111011100000001101011110000101010011110000101111 1010101110100011101111100010110111000110001010111101000110010010111100110100001000101110110101101100110011101000101011001001100001001000111111100011000001001001001000101000000011001110100001111010000010010000101101001110010011100001100000011000010100010100100111010101011011111110110000001110011000111001011110010111111100011001011111110100011100110100110011100000000001100100101000010011101111000101 0001100101000101100111110101000100011100110000010001011111001101110001000111011001110001111101010010010100001110011001100110000110110010110110111010000111100010111010110001100001101100110110100001010010110001100100111100101010001011010011001101111000110010110010011000100000000000110111110000101010001100111111101101110101001110100100100100010000001000100101001100010110001010001101100000000110111100 1100110110010100000001100000000001111000010010011110110100000101001100100001100010010000101001010000111111110101101011110100011010011010100000001101001011011100111101011000101010010100000011011101101100111101010101010111001110011011010000001100110001100101101110110000111110100000010110100001101111110100100110001101110101110000110001001011110010000010011110011001001001100100000000001110011100000110 1101011000111101111011110110000111011111101010001001100001100001101101011000111110010000010011011001011010000000100110000111001100000100001010101101010001000000011101001110001111011011000001000101100011010100010000001100101101011001101110010111111000000010010011101001110110101000100010100011000011010010001111011011101001000000000001101011101010111110011011110001100110101001000110110100000011001100 1101100000110000010011011101100000111101100001101110110101101000101111111011000001000111101110010010100000100111100011000000111110110000010110010000111101110001111000001010010110001100110001011010110011110111011101000001001001001101000100001101110100111101011010100100000101010010011111110000101110001110001010101010011001111111101001101100000011101110100001111111000000000001111001011111111001010101 1100001101000001001100010011101110101001101000011101100100001111100100111110001001001101000100110100101110101011001101100000110001111011001100011100001001000001011001010000101000100110100000110100111010000110101110101011111100001000100101100000010100010010111100011100110101000010000111001111111111010101011001000001111110001001101011001110000001100010000111010101100010010101110011000101000111010001 1011001001011100001101101010010111001010010110001010010110100100110110000000001101011110010111101110111010111001101011011111011111110100010101111000101111001110101111010001011101101001000101000110000101100111011011111010101110110101011101011010111001111101010000000010101111100100011111010001000110110011000010110100100110111000001101111010010110011010000011101101010110010101111001110011111100110010 0010001110000011011010100011110000001110101110111010111110101100011100001100111100010000111110110001101011001000000011110000111100000101100101111101011001001101000000001100011100110110110010010110010001001010000100000101000010111000001101000100000110111000011101111111100101011101101110011101010100000000110011010100001001000111001011111101111101100010111100110111110011001010111100111110011010011101 0100010010101011010100110001110110100101011000101000100000010001111110000101011011000110100000111101111101010011100101011001110000101101010010000101000001111100101101010011110001001001101001001110011100000111010111000010100111000110100000011100111111101101001011101111101111001001011000111010111000011010111011110100110100111111101001101111010001011101100001101110001100010000010011011100111010101000 1101011000100101100011110000000110001000100100001010010010111101111100001100011111100000010010011010101011100101111001001000011011100111001100001010101010010110011101110101000111010111101000110100000110111100011001011110101110011100011101100001111101101100001101011001100000100110111011011011010000000001100011001001110011110001001101010011111101011011001001000110110101111011110101000011010011101001 1110101011101010011000100100100101111000000000101011011110010110011111010001111010100001000111011001001101100011011110001111100011111000100111101111100110111110001111111001000110000001111100101000101011000111001101000100111000000011000010110110011101011110000001000100111101001101111011001000000101010110001101101101111110100100110000110000111100100111001100101111100011010110011110000001111011010001 0011101001111001001000000010100110111100100110010001111110111101000011000001101000001101001110100000110111000001101111000010010100111010011011000110100111110010101111011000000101010110000011010100010011011010000001110010011001111010100000001110000100011001000010011100101101101110101100000000101110000010100010101010000100101001101110010000010001001101101100111110001100101000001110100100110010000100 1001011000100011111000101101001110101101100001100101010000111100011111011101001110101010110111110001101100001111101000110010100110011110010001101100010111111001100101101100110101011010101110110010100010110101111111001010010101101000000010111101010110000111011110110001111110011100101001001001010001111101101000111010000111001010010010000010100110101100011010111011001000010100111101001100011110001100 1011111100011110100111101001111111111000110001011101101100011001100001011001000001001100111101011001011001000001110100101011100111001000100101100111101011101011101010100100111011110010000010010111101100101111010101010011011001110100101001101000010000101111000111010111110110110111111001111101101111011000101010111010001100001111111110101001001101000010011111010001001011110111101000011001100011111010 0000010001010101111011111101111110111111011010011111111100110100110000010101011110110111001100000110111110000111101000111111111011001110100001010000100111111001101110110101001101110110010011100110001001111011111110101011001101001011011101101011101011100111101110011010000001000010011001011110111000100000001100011110101101001110110011101110010110111111100110100110001001111111001000100011111110000100 1001001100011001001101011010111100111011011101001011011101001101110011111101011000110000100101100101100000111000110100000111101010100110001100111111000000010101000110110110010100000101000101110110011010111111111010100011111110011110110111010011000100000010011111111111101100000100111011001111001111011101110011110110011000110001011111000111001110100111101000001011101001000110000100001111100101010111 1010110100010001001000110110011111010110101010001001100111110010011101011001000011000101110011011001100011111111100100111111010111110010111001011010101011001101101101101001101010011111011001101111110101110000001001000101000101101011001101001110100110111010110110001101010011000100010001101110011010010100100001010110011011101110000111110100001111110110110111011010100100101101011101101010010010011101 1101010001100001001010000101100100101011110011010011010000101011000110100001010110111000010011101000100001010101101010001011100011011101000101000000100001110010110000101011000011101001101101100001110010100000001000100101111000010111000110110001111110000011010010011010010001111101001010011101111100000001100000010001111010100111001011100100100100010001110001111101000110011010100011101001110010010010 1001000011010000111100111011110111010010101000110010000101011010101010110001101000100111001000111111000010110010110000110010000000000011011001110011010100001000100100010000100111100111110110000110110111101011110000011011110111001001001010100111100001100011011011111010100100101110000011001001101000110001011100110000010010100001000110011101100000010111001001110000010011001011101001101111101010110100 0110010001111001000111100011011110011111001001101111010001001110101110101001011100000011001000110010111011001100001101111101100101011100111011101110110100011001011001001010100111110110000001111010001111010011001010100011011110100111001101010100110110110000011100010101011000110010001001101110000001011011110010111101101010101101100000000001101001110111110011101100111100110110011110000101101000011101 1100111100011111010001000010011111011010101100001010110110011100001110110001101001100001101111101110000111001000111011011001111111111001001011000001000101000011001010101101001010010011011010000001111011100010100110111011011001000001001001000011001001000001100011100101001010010101110001000011101000001010011001110111110100101011011100111101110101111000101101110100000001110010000111010000011011001110 0000011100011110110001001110100111110100111011001000001111010011110001110110110001000100001100110000010100001110100011011111111001111001010110011011110001000010111001011000010011001110110000101101110010111011001110010001110110011010000111000001010111010010110100100110110111110100001000101011100011100110110000101011111101010101100000011010110110001100111110000010010100001000011101010101110010000100 0000100000000111010001011001111101100110111110100111100010111101011110101010101110100001010001001000101001101010010010110110111010011001000010100011101011011011000111010000011111001101000011110011001101100001101100010110111101110010011010110110010011100001011001011011110001011100011010001011000110110111001010000010001001011010001011100111110010111010001101011110100000010101100000001110001110000111 1000100111111101110111110100000101100101111110111011011100011001011110100111110111011001100000011110010111001111000011100000111101000100000100010110000011001100111111110000000110101001011010100100110100010011000110011001100010010111111000000100101111011101101111111100011000110110100011101100111110000101011000001101101100110000100001000010001011011111100000111100101111001111100101011111100110001110 1100001111001111011100000100010111100111010001011010011110001001101100101000011010101111111110001100011000111011101100111011111110010100100010101100100110000010010000100001001110111111111011011011011100101100010011100010100010010010010100011110101000100010100100001001110000010000010001100010111110000011001010001000011100111001000000000111010110101010111100010001100101000000100000011000100011010101 1011001100101111010100011100100110110110111010000010010101000001011110010110101001001111110101100010111000100011100011100000100000111101001001010001101000011101110111001111011110111111000001111011011000001100110000001100101000100111110000010010111000111001010011111000110110111000100001101001111000010110100100101110110010001110110101001101001001000111011001011000000100101101001011000100111011010000 0111011010100000100111001111011110010001010111100011010001001100011101110001101101001110011001111111101011001001110010110111110010110001111110011111110110100101100111010111111010011111010010011100101111101010011111001111011010001110101101001111100001000011001001011011011101110111101011000111101111100000111010011100111010000011100110110000011000110110111011000110010001010100010010110110101101101101 1101011000011101111001000110001110011001110110010101010100110010111110010001101101101010011101100000101010001101011010101010011101000111000011011000101000100011000101010101100010110001100010011000100011011000110101110000101000111011110001100110000110000111010100010010111111000000011010011111000100001110011100100100111001011011101111110111000000110110001111100111101100001111110000010011111001010001 1110100100010101011110100110110001001001110101001111010110000001001010011011100110110110100000110001010010110100000100101100010111000000010011101000100111111000110101110110110000110100111101001101010101110010010001111100010101101110111010111100001001010111110000110010011101100001000001001101111111110000011000010101011001111000111000000111100100101001011101111111111000111101010011101101000101001101 0100111101100010101110101111100000000010011000101101001000100111101110100100000011100001000011010110100001101100001011000111001100001111100010011001011101001000011110110110111101110001100110010000111010010111110010001011000100001100111111110010111010000011010111100010100110011001110010111111101110110111101101000011001110010011100001010101101111101000110110010011101011100110111011111000111000111111 0100000111000001010100011111001000100100111011101100100101111100011100000010000001100000111111111110000110101101011011011110001001100011001111000101011111100100000101101010001110101000000001010010000000110111101111000000011100111100100011111111101111110001101101111101000011100101111000101010110010001101010100010001101101001010011011111000011101110111011010100101111110101111101001110100011100100001 0010110010101010111111100101101101110011101111110001000111100111011101110110011101001011000100000110000111101000100000011001011101011010100100001010010101111001010001111001010111010010001101010011010100000101111110111101111100000101101101011000000010001101011011100111100111000001010111000110011111100011100111011011001011111010111001000100011111101111000111010000000101100011110011100101101110010111 1001100010001010001111000001100000111001101101111000010101001010100011011100111011110110101001101000110001101010111011000101001010111101000100101110011010010110000100010110110001110000010101110010000110101010101010010001100001100011101001011010001100001101101100111100111101001001110100101000001000000101100000000101111011001010110010011011001000011000001101010010101000100000010011100100101001101100 1110000010101011100100000001100010011010001010010000000110101001100111010100001111000110001000001100011001000100010111000111111001011101010011010001101010010001100011101100110111111010111011001100111010101000111110101011100010100100111001001111110000101111010101100111101111001001100011110110110110111110101010011001110100100101011111011101000010111100000101001010111011101000011000110101011000111100 1010111010001101000100011111011000101111011101100101010100111100110111101010000000010000101001010010001100111011101001000111000010010110011011100111001100111111110101000000110000000100111111111000111111010101011111110101101111011111010010011111000100111101011001100100111100101001100111101110110101010101101101110001000101011100011100110000100010111111101110010001011111011011101011000111100000000010 0001010010110100110010001111011101100001101011101111111010001011101111101110111100101011111100000001000001010111000101000100001101100101011100010101010111101011110111010111000100110010011010001000111101011010001111011001101000010110001110011100001111001010000110101111110110111000001001100010011100111001011011010001111111101110100100111000111010111001111111111110001010111110001101000101011001100001 0101010101111101001100110111101100100111011001101101101111101001001110110011100011110111000010110000010000011001010101011001000000010110001100101011111110001001100101001110100000001100000000110111010010001011100011011001100011001101100010111010110010000011001011101111100111110100111011100000010101011011110101111010001010001101011101110100100011110000001101011100000011011101010101000000111110101101 1011111110010100110000010001110111110000011001110100101111111100000101011100110111001101101000110010111010001110110000111111011000101100011100011010011011110001011001010101000100000011010011010000100010100001011000101000110001011111000101000100100111111111100111001000001010111000011111010100011011010010100101101110101101000111101110100001101011110011101000110001110111110101100011110111100001001010 0101000000110010101000110110100101011100001101011101111100100100101110101110100010111110110001100001100110101011010000110011010110100010001100111100110000110110001100110110001100000011010011100000001101101101111010111001110000100111010011010011001100111000010101010010010001010000001011111101001100010100111001001111011101010110101000010001011010011010001010001001000001101011011000011000111011010011 1010100101101011101000100000111011001110001001100110110110100001110101000100010101111100100110110001011011000110110111111110111111011101101111010110001101001111111011101110010000101110010110000111000110011010001111001010111001011010100001110101110010111110011101101011010100001011111001001111011011010011001000011110100001111001001110100010101011011101111000111001110001000010000010100010001001100000
cTrader Algo

【cAlgo】含み損益状況をリアルタイムに取得する【Tips】

2/10/2021

5年以上前の記事です。内容が古くなっている可能性があります。

Positionの状態をリアルタイムで把握したい

保有中ポジションの情報はPositionsプロパティから取得できます。例えば全ポジションの総含み損益が知りたければ

private double GetTotalUnrealized() {
    double sum = 0;
    foreach(var pos in Positions){
        sum += pos.NetProfit;
    }
    return sum;
}

こんな風なメソッドを作って呼んであげればいいわけです。しかし、総含み損益なんて刻一刻と変わっていくものです。

そこで今回のテーマは、リアルタイムで総損益を使用するにはどのタイミングでこれを呼んで取得すればいいのか、ということです。

 

3つの方法

3つ方法を紹介しますが、手軽→正確(よりリアルタイム)の順で紹介してますので用途に合わせてお使いください。

 

1.OnTickやCalculateで取得する

当たり前の方法ですね。これであれば値動きがあるたびに損益計算がされるので、プログラム稼働中の通貨ペアのポジションだけであればこれでOKです。

protected override void Calculate() {
    var unrealized = GetTotalUnrealized();
    // 表示させる等、なんか処理
}

問題は他の通貨ペアのポジションの損益も正しく取得したい場合です。稼働中通貨ペアで値動きがない限り、他通貨ペアのポジション損益は更新されません

とはいえほとんどの通貨ペアでは数秒に1回くらいは更新されることになると思うので、おおざっぱでいいならこれで十分かもしれません。

 

2.TimerStartを仕掛けてOnTimerで取得する

たぶんそこそこちゃんとやりたいときの一番手軽な方法。cAlgoでのTimerはこんな感じで簡単に使えます。

protected override void Initialize() {
    var interval = new TimeSpan(0, 0, 0, 0, 30);
    Timer.Start(interval); // 30ms間隔でOnTimerを実行させる
}
protected override void OnTimer() {
    var unrealized = GetTotalUnrealized();
    // 表示させる等、なんか処理
}

これだけでTimer.Stopで止めるかプログラム自体を止めるまで、30ms間隔でOnTimer内の処理が実行されるようになります。

例では30ms間隔での実行にしてますが、やりたいことに合わせて変更してください。重たい処理をさせたいならもっと間隔あけた方がいいかもしれません。

逆にとにかく頻繁に処理を行わせたいならさらに短くしてもかまいません。ただしタイマーの精度は15ms程度です。これ以下の値を設定しても、約15ms間隔での実行になります。

 

3.各通貨ペアの値動きに合わせて取得する

ポジションの通貨ペアに値動きがあり次第、損益を更新する。これぞリアルタイムといった感じですね。30ms間隔で行うよりも処理に無駄がありません。ただ上記の方法に比べると少しだけ面倒です。

コピペする場合はファイル冒頭にこれを書き加えておいてください。

using System.Collections.Generic;
using System.Linq;

以下はメインのIndicatorサブクラス内のコードです。(cBotの場合はInitialize()をOnStart()に書き換えて)

private List<Symbol> _symbols;

protected override void Initialize() {
    _symbols = new List<Symbol>();

    // すべてのポジションのSymbolでTickイベントに処理を加える
    foreach (var p in Positions) TryAddSymbol(p.SymbolName);

    //新たなSymbolのPositionが増えたら_symbol追加
    Positions.Opened += args => TryAddSymbol(args.Position.SymbolName);

    //不要なSymbolを解放
    Positions.Closed += args => {
        var symbolName = args.Position.SymbolName;
        if (Positions.Select(pos => pos.SymbolName).Contains(symbolName)) return;
        var symbol = _symbols.Find(s => s.Name == symbolName);
        if (symbol != null) {
            symbol.Tick -= OnSymbolTick;
            _symbols.Remove(symbol);
        }
    };
            
}
//-----------------------------------------------------
// _symbolsになければ追加してTickイベントに処理を加える
private bool TryAddSymbol(string symbolName) {
    if (!_symbols.Select(s => s.Name).Contains(symbolName)) {
        var symbol = Symbols.GetSymbol(symbolName);
        if (symbol == null) throw new ArgumentException();
        symbol.Tick += OnSymbolTick;
        _symbols.Add(symbol);
        return true;
    } else return false;
}

//---------------------------
// リアルタイムで行いたい処理
private void OnSymbolTick(SymbolTickEventArgs args) {
    var unrealized = GetTotalUnrealized();
    // 表示させる等、なんか処理
}

コードがわかりにくかったら申し訳ありません。コメントに書いてある通りの処理をしてるんだな、と思っていただければいいです。

ポジションの各シンボルを取得して、それぞれのシンボルの値動き(Tick)イベントに合わせて総損益を更新しています。

Positionsに変更があったときの処理も忘れないでください。Openedで新しい通貨ペアのポジションが追加されたら新たなシンボルを取得します。Closedの処理はなくても動きますが、無駄なメモリ使うのは嫌なので、不要になったシンボルは解放してます。

もしかしたら、手動エントリーしたすべてのポジションの合計損益がいくら以上になったら即時決済する!みたいなcBot作るならこの方法がいいかもしれませんね。たかだか数十msの違いで結果が変わるかどうか知りませんが、少なくとも精神的には安心感あります。

 

なんかリアルタイム処理したいときにどうぞ

今回はポジションの損益を例に出しましたが、他にも相場状況に合わせてリアルタイム表示させたいとき、例えば一覧表形式でスプレッドを表示させたりだとか、通貨ペアごとにトレンド方向を一覧表示したりとか、なにかしらリアルタイムで行いたい処理がある場合はこれらの方法が使えると思います。

ご参考までに。


まだコメントはありません

新しいコメント

コメントは承認後に公開されます。承認まで次のコメントは投稿できません。

cTrader's Life

© 2026 ajinori