1011100101100011010100101111011101010010100101101011010010001000110001001000011111000111101010000011001001011100001001101010100000110011011001000001111011011111110101000000001110101010010000111000110000110110001100011110000011110010110111011111011111111110101110101110111001100001110011101100010001110000011011011100111100010100110101110001111000101010110011110010111010011000101111100101011111011011 1101101010110111000100010000000001011111000011001011110011000010010000011011010010100010100011001010011111110111010010011001100000011000011010000111100001111100101101100101100001100000101001111000111001111101010010001001110110000000101110011111100011000111111101100111000001110110010011101000110110100010010010111001111100100011110010000011010010101100011101101000011100010010100100000100110011010110 0010011011001010010110101101000000001100101010010111101100010100010110010011100101011000001000111001100010001111111101111101110100011000100100100011001101001111010010101100111100110000101011000111100000110101000111011100100011000011000011001010010011011101111001100111110011101001101101000100000001010111010111011001111101111100111011101011111010100101100101101100001001100010111111101110111011001010 1100010110000110001110101110110000111000001110110010001001000101010100111011011101101011011011001001111010111001101010011000001101110011110101000101101110110110010100110010011011001011001010000001001000001110111100100100111100110101111111100011100101101101010110100111011101000000110000110101010100100011011010001011001110001101001010011111011110100010100101000001000000000001000100111110111110010010 1111101100000010111111000111011001110010010011101110011000011011000111101110100011111100001000100010110111100001011011001010101100010001101101011101110010111110101001010110100001100100010111101101100001111011001111011100000110101100010101000100101010110101000111101110010111001011011100001010101110100010001100001101000110011010110010101110110111101001010011101010011000100110001111001110111001011011 1000110000010101110001101000111111100101111111000110001100101111011111010111011111011100101000000011111110001101100011000110100001011111100011110100110001110001001110100111010100100100010111000001000001101011100100111000000101100000111000111111010010010010001011000000010011101111110111001111110010011011001010110001001001110011000011010101110111011100000010011110101001010100011010010110111000100101 0010000100111101111001011000001011001101010110010111011101100101110000101110001010011000011000100001101010000000000110100010000110111011010010100000101100101001011001101100011010110000110111010111000100011111001110010100111111100011010010101100010000100011100100111100000010111001110000011101010010010110101010000111000111000111111100010011110100011001010000100000010000001100001010100010100101101000 1110000010100000011110110011001010000111011110001110101110010001100101011001101011100011110010011101101100110001000010000010110101011100111011000111101110000010100111101100100100100110011110011010010100110010101011100000011111011100000011010010000110101000000010110111011111110100100101010101000000011100100000110101001011001101001110111111100010010101111001101110001011000101011001001110101010100100 0110110001100111101100101010101101111111010010010100001010001100111000100111010000000100110010010111110010100000000110111110101101010101010000101100101000011011011001000100101100001100000111010000001010110101010100101110100000111110001111101000011011110000110101010111011000000000100010110101101000000101001111000010110110110011110010101011110110110110011110001001000000010100000100110111101000011101 1011101000100011000001111011110000010000000111111001001010000001001011000101001011110101110101110011111001000010010010010110111010100100010000011110010001001111000011111110101000010001111110010101001111100101000001110000101101010011011000011000111000111101010001010111101110111111010100100101001111011100100111011001100110100100001111101100011001110101101011100000011001000000000101101111011100111100 1101100100100110111110011100001101010110101011101010011011000100101000010100100101100100100001111010010110110110110000101110001001110110111000010100001001100101000011010110010101101100100000000000011111111010101011010000101110001011000101111001001110111100100101010011101011001110111101111100011000110001110001101101101011100011111001011101111110001000011111001001110001111110111110001110011000001010 0100110100000001100111001001011011101111100001101001001101001010100100001101100110100100110000100101100001011001111001110100010111110011111110010010010011011010001100001000000001011101011000001001110111100101000111001110001101101001000111001010011011101100000001010001101000001001010000000100000010101111101001010011100000110000000100110010010111101101100111000001111010011010111111001100001100010000 1011000001101101101000011000000100111100101001110100000101010011000101011110100001111100111010001000000100010110001111111001100011000101110111001000011110000010111110011110101010111000011111111110010110000110111101111000100110101111110000100000010101100011100010111110011110111011000001011000100000010001111010011000000111101100101010010100011111001111011111011110001111101011011010100011010000100010 0100100110100010100000001011000100011010010100011010000010111111110110111110110111110011010101110000110000001000101111101111000100111011100100011110010110101000101010010100011101000001101011110010010110101001010000001110001111010010101000101000011101111100101011101110000010100111010111110011110110111010011110100010000101100010011110111111011001011000001001001110111110111011101001000110011000111011 1110100100101100001110010010101101000100010110111110111011011010011100101101111011010101000111101100111110101001110001110110011001101111100000101111111001000000101010000110011101001101010111001101110101010010011011001111101000110100111001000100111111101010001100110100110001111110111101001010110011110011100110010111111110100110101110110001001011001110011010000101000100000110110001101110100011011010 0101111010010101000110110110110010110010111110010010111000100110000000111001100001110100001110000101100001001101000110001010000001111000100100011010111100011111010111001000100011101011000001101010001100110001011001011111111000100100110010010000001101110010110001011101011110011110100011101110100111000101111000110010101110110101011001100110000010011110101000011100111001111000100010010000100010111010 1000111000110010001010010010001011001001011001001011101101001111101011101100100000010010001110110110110110011010011010111011011100111000101001000101011110010101100110100001001010111001001111000001101110001000011110000101101000011010101001100001101001001010110010101111011110000101001000110011111101101111000111010010110101000111011011001011010111101110101000000000000000101110111001111101001000011011 1111000111101011100110101000111101111010100011110100001011101110111101010110101001100110111010111110011101000000000000101101010000111101110100101100001111001100011101101011100010110101100010000110011101110001001000010000001011110000100100011100101111010000111111000000101101011100111010101110000110111100100111001001101111010011110000000010010110000111010010000100001111010000100101111010011010000010 1111011110011010100100101111111110000111000000011110010011010011101111010011100101100010001001000011101010010111100101010001000111010110101000000100110001101001101010010111100011011011010110110110000110000011111101001111110100001100000011100101000100010100100000001001110010100110001111110010101100110111011000000001010000011000111110111011100111101011010101101000011101100011100010010101100110100010 0000111110010101010011111000010101011010011111110010111011111100101101011001001010111010001001010111001100111111101110000101110000110100100011001110011011001001111101011000000001011110111101010101110100110000001101100111111100111101000100111101101011000110101110111001010000000001011011100100000010110000111100001110110101010101011111010001011101111000111000011001011110010101010111011010101111001101 1000010011010101001110001111000000010011110010110110100001100000101001111100110011001010100110001001011110111010000100000001100101111110101111001010000110001111000101011100100011100001100110010111000110001000101101100011001001110111000011111110010000000011001011000100110100000100011100111001101010001000101111110100110110101000010011110010111111111100011101011001101101011000110010001111101000000100 0001011111111111010000110010110111101011011110111101101010000101000101001111000111011110000001000101110011010101111111001010111111100110100110001101110111010000001010110110000111011001011011010110000000101011000100101000110110100010110110010100010011011110010000101111010000101111100000011100010101100001000101110100011100001010011010011010011011101011100100011001101101010101000000000110110100100111 0111110001101010101111100111100111000101011001000011101010010000110010111111101010101100100001100100000110000001011010001110000001101010011100101100001010111101111000111101000101011110010000010011111001000010011001010111000011000111001010000011001010010100101101010010011100010001011100111110111110001010011001100000100100000010110000110001011101011000101100100000110100000000000010001001000111110101 1101001001011100101111011011011111001100010010001010001010011000000011100001111001111010001001100111010101110111110101010100000110100010000110000111101101001011010011110010101001000101011010101110010100000100011110100011000111010110101100001110100111010101000001110000111101100111001111110000111010111001011011100110011000001110110010010011010000011010101010001001000010011000100111010101011100000101 1110011000100100010101011110000100001110110111011101000110100011110111001111000100001100111110110000001101000011000010110101101000011100110000010100110111011000001110010010110100010011100111111000011100101111010001000010111111100101000110010101001111110111010100111001110100010000111111000111100011010010110110101110001010111110010011100011111010101110110011100110110011000110011011111011101101100000 0101110101001010101011110110010000001001000000010101000010100101100111100000010000010110100100101000110000000110101111100100111111000101100010011011101101010011010011011110101011000011110101100101010000010110000111111011111101001011010011001000010000011100111011111001110100100101110100010001110010000110100001101110001110000101000100010101111011111011100011100000011100011100001111010000101100010110 1010001101001110101101011100110010111001101000001010000110001100110101011011001010100000000100101100110110110101101100101101100110000010001101100001100100110110000110000100110100100100101010010110000111011100100001100001111010100010011111101011101101100100100001101011110111001111100101111111011010101100001111110101011001101001001010111110110011110011010111000100101101101100001110000101111110010111 1100101010000111011110000000101001101011100001011111001011110100110011011000011101110011010100101100011111011010010100101000000010111011101100101000010000000000010101100111100110001001101110110001100100000110000101001101000011000010101001010111010011101111111000001011110101011110100011011101101010111100100100010011111000100101111101011001011110000011100110111001110110100001101110000110110110100000 0000110100101000111001101111001101000110000100110101010000010010001010001001110011110100101101101110000011101001011101101111111110000110001010010000010101000000001111101110010011011111001011011000111000011101010000001011001111010000110111100000001010010000001011001011011101111011111010000111000111110001010010111111100011110000001100111000111000110101011111010110101000001100111001010101100001000000 1000011101101011010001011110000010000100111010110111101100110110111110010010101100101000110101000001111100000011011010100111000011000101000101001000111001010001010110110010101110111010101010100011111001001000000011011001110101011100010101111111010010110100101100001000010100010100101100000001100111011111010000110001111100010111110111100111111110001111111000010010000111010010100100000101100011000001 1001000100100100101101101100100010001010111100010010000011101000011100100010110010011100010000010100011000101110111011001000010101110011110111001010111101000000011010101000100110010010110001111011011110101101110111100001111100000110100010111101110111001000101101100011101010001011011101011110001111111101110001001101010010001001110100001101100101111011001111111101000010101101100100011011110100100101 1101111000110110111110000001101011100101000011111111011011110011101011110100100010000000101101011010001011111101101000101011001110110101000001100001000000100010001000000001110000010011100010110011011101001111111010111011110010010110101110001011011011100000000111010100010110100011101101101011110000010011100001010000011101101010100011011010110111110010001000000011101101100111010111110110100111100010 0011011101101111110110101111011001111111000110100000110001000100110011111111010010111001100001111011000111001110100010101011010101100001000000010000010000100010001111100111001100100000100110000101111110000110110100110101000111110001001010100001001010100110111011101110110011111010100011110011000111100001010111111100001101000001101010000100100100110011000101110010110101010011011100010110001100010011 0001011001100111011111000100100111010000111111100001111111101001011111101011001111111111100000011000010001001001000101000100111111000010000011011100100000110010110110110100001010111001011001001011001101111110011100110001110100110000000111111100011111111100110110011101110100000100011101100010110100000000011111000100011001110101011001100000010100110100111111100111110110011110111111001101000010011101 0110010001100001001101110111001000000001001001000011101110000100000101000001100001111011111110010110100010101010000000010001100100011011110101100101111011001100110101000110010010110001111100000010001000111110100111110100110100010011100110110011010101110101010010011001011010101001101100111111010011101010110110011000001110110000011111001100101000110111000011000010000100010001000100111111110011100011 1111001101100000111100001101111110100101101011111011010111100000011101010111001111101000011101000000110011000101001100101001000001110000011110110100111001110101101001011010010110100110010010110000000010110111001001101110101000101011000001100001101110101001000010000111101001111010110001011000110000010001110110101110011000001110101110111001101001001011001111101000110110110000100010011111001110001001 1010001110000011001111100110110000010111100010001101101100000110010110110011000100111001011001010010101010000100110111000000101010000101101110010000001110101010101000001011110011101111101001010001100011101011000110011000001011000100001011111000011000111110011010110000001100111101000000110100001001101000101000001000110100010011010101101010000111100000110111101110000110010011101101001101011110100000 0100101101101000101110011111101010111111101011101110000001010101001011001110010110111001010000100101101100000011101101000000100110100010110101100111011111101000000011001010101101000111101110101000000010010100000010111110001110011010111101000001100111101011111010110001001110000000100010111110110011011010100110110001000010011111101111101101010011011010001001011001000111101001000111000010000111010001 0110000101011101000011011111100111011010101001111111101010100101110011100001100111100111011000001010101000101111101110101000000011100011110101110111011001111110100011111010000011100101101011010100000111101000110111000010000100011101001000101111101001001110001100101101111001010100110100011101111110110111101101011010000101011111001010110010011110101101110111100000111001011101111110110011100101010111 0110101011010001111101111110100000001010101111111010011110110110101010001110111001010100100101110001110010001001101111100011100010000011111100110001111100110110100100110100101011101110111110001010011100000011100111000110100000010001010000110100110000110110000011110010110100010010111001101111101100000110110001001101001000001011111111101001101100001000111100101100000100101101101101000001110010001001 0100100110000111011100011100001110010111001110001001110001010101101000100110110110000110111101111101110010111011101010000001010010010010110011011000001111001000100100110100000010010100111111100111010111001111000111101000010000101110111010000101011010110001011010110111011000101010000100000110000010000001100011001001001110001010101010000110110101011111100101110101100101100110111110010110011110100010 1100010001110111011010111111110101110011010100100110110011111101001000011001010111011110101011001000001110111000101000111000100100111100101100111111110100110101011011111110011100110000001011101001111010001011101011111101001101011000011010110001110110010100000101011000010111100111110001011110110101001000010000001100010100110010001010100001110001110110010010011110110100100010100010010010110000110101 1001101101001001101111010100000011011000011111110010001001000000000000100000011010101010101110101110001101111011101001000011110011010000000011001101011000100010111110111110100000101001111001010100101101100111101010110110110111010011011111011110011100010001010010010100010100110001101110100000001110110000111001100101010100101101110101000100011000010110001100111101100011111000110101010100111011100011 1110111111101100000111101010011011100101011101000011001000101000010100110011100100100000010111100101111111001000001100011001000010001101011011001110010000000010101100010100110101101100100011110111001100111100100001010011111001111000001000011000000011010001111111110010110011111010010100001100100111000000010010010010011100100010001111101110110010101100111101001001001111010110010011100001001111011101 0001010010101001100101000100111000101010100001000101011011110000101011000000100011001101100110111111111111000101101011111000001000001001011011100001010100011100111111101001010011000001001000101111100100000110111111111100101111100010110000111100101101101010010110111111111111110010110010101010100010010100001001011010000111101110010110010000010011111111111011011100111000010110000011110001000011010001 1110010111001011100100100100011110111010111110101101011000110011010001011001001101100001011101111010100101000000011010110101111111001101110101010010100100101001001010111011100000001001100110100010111000010000000110010100001111001011000001000111100010001011100101111010111100101010010100100001111111000110100011001101110111111101111100100010110011001000011111011100011110010001000010011001010001111000 1110001100111101101101101100100111101110110001010110100111100001010011011101011001001110101100010010100010011010000010101000010011100010101000011110110001011100111000010000001010101111110000001000100111111110100000010001101100111110000110010111001111110000001100101100000001010101010101000000100111100001001101110110100010011101100000000000010111110011111000010000010011101111011100111000111111010101 1100110111111111111011011010100111010101110010101111111000010110001010001010110101101010011100001010000010110110111010110111110010000110110010010000101100001110010000011111000111001000010011011101001000010111101001001110100000011001111010111111010110000110000110000010001110000111101001100111111110000101001000111011110000010101100001100101101110010001011110100110111011011011100101011000101011110010 0101001010001011000001110100101111010101100010000011000010111101101000001010110011011100110111011110100010011000100001111100110111011011000010100011011100110000010111001110000110011000101100001001110100100101110101001100100101110011110101001000010111010101000001101011001011100100110010011000000011101110110011000101110101011010010100011000010010011100010101001111000000110001111100001000111001110011 0011111011010001100000110000001100100001110110011010011110000010111001111010011101000000100101100111110010100100101000100110001001011100110000111100001101111110111110101001001011100100111010111101101110100000111010101000101000001001111110010110111011000111100101100101110011001000000100000111001000101100101101111001100001001010010110101101000110011010011100000100011110101111010111000101110111011111 0011001111110010111110110110111111011111111100101011100100110011001010100110001000011010010100100000011001000000001111101110001011101000000011110011001100110011111110101111110011100111111110111110110010111000000001101110101111110011110010110111100000100111101111100010000101011111011011101101100011100000101001010101000100001100101001010111111100010111111001100111100110101111000001111011110111001100 0001110100111011100011101110110110000011101110001000011010010101101000011011011011010000001111011011000000010001011011000010000110000100101011000101001000101110000100100100010110110001011111001010100111110110011011010011000101110000011110111100011100111100101110011011010101011101100101111100010111101111110000011110110001011100010000011101110111000010100001101010011010101101101011100010010010100110 0110111011010100100011011010001001000001110101101010101001011000110101011010100011011100100001111110000101100100111000111011011010101011001100010001001001111010100110111000101001000011010110000010010000001100011111011000001111011001100101100100001101100110110111111110001001000101111100110110111110111001011100110101100000000000110010001111000111001100010101100100001101101111101101011001000111111111 0001110011110111100101011001010001111100110010111111110000001011001010111001011100011000100000100010000001101011001101000011101001101101110001001001111010010011000111111010100010111011001111011001101110010111101110000111100011010101101011101101010010011001001100101000001011111110010000010001111011100110010100010001010010011001111001000000100110000100101001010111010101010100100001010110010000010010 0000101110011101010000011011010110011001000000101010010111111011110001010001101100100011000101100000110000111110001110111001111000010001101001000000110011110110110110100100101001000011001110000111011001111011100011001011111101100110111010000011110000001110011100011000010110111100010010110010001100111110111111101000000100001010100000000101001110100100101110011110101110010111000011010010010001110011 1011101111011000001101100001111011011010110101100001110000101101101010100110101011000100100110111110000011000111110010110000011010101110101100011010010110001110101101000110100111000101000110000001111011111100100010000110110100011111110000011000101011000010111110110001011000011101110100111000001110011101100010001001001010011100101000100110100110010010000110011000100011010000101011100010000000011011 0110110001001011100101111001110001100100000100000111000101001001001001010010000001010000101000011011001110111010111101011001000011000010101101111000110100110000111001000110111011111110111110111011100111010101001010011010100110011110110011111010000000111111101000110010101010110010110001010101100011010111011011000010100010110101000110111000110011010110101110011010110010010011000010110101001010010100 1101000011111000100101010100011111100101000001001111000001001001010010000000101000001011110001010011010000101101101101000001101001001001100011111111100010010111000011010101110001101011011010101001001101000100001111010000000001010111001011101110000111100000111110001110100010010111101100000101100000000010101001101000000010011000101110001001000000110001000101010011001101010100101011111011110011110111 1010011110001001110101100110001110000001010100110100100011010111101000100001111011011100011110010010111110010101111111010111001011011001100010001001111010011101011001110101001111101101110000000111011010111010001010111100100001011110111101001000110110110101111101110100111001001100111010000111101000011000100001011001110100011100000011010111000000011101001011010111001100111110001100011011100001111011 1111010001010111111010110110100011011010101100111111011111110001001011100001000001100010011011001001110000010110000000110000110100001100101111000101100011011011101101000100111101000111001011101010010101011100001100001001101000010110010101000001000100110101011100000100011011001001111001000000110110100100000010100110010101001001100110001011000111010101110110111101110111111011111110111011000101010111 1101000110100100000010000100000010110011101011111000100011001010001011001100000111100100110110011011111100100010000000000000110010110001100001101110111011001010010011101110010010000001010011110100010001100110110100000011011000110110000100111011101101100100100110010000111000100001111011000001001001100100110101000101110110110000011011000001100101110100000001000101111000010011011100110101101010010010 0110100011100111000010011011010100100101001101000000100010101010101111000101001100110010010001001101100011001101001001010011111101101110010100111010010111101010000010001110110001101000000110111001011100000011000101101010111001001011110010111101011111000111010000000001001101100101111010010010100110011101100011100100010101101010010011111101001101001110111010000111011000101000110111101110110001001011 0011010110110000101010010111000110100111010100110110101101011000000111000111111011110100001110000111100110001000110110011111101011111000110110011011101001010001111011000110010010110100000001010010010010100000111101010101111111010101111001100101110001011111001001001101101111101001011110011110101100101100100010110110011001001110010000110000100010111010110111011010111001001110010111110101100110010010 0011100100100100101111001100010000010101001010011010100010111110000100000100011011001010001111110010111101101010110001010100101010111011110011000000001101000000010111110000100000001110001110010110101010101111011001110010110010111010110011111000010010111010011111011001001100001101111111011001000010100001011101101001011101100111001001111010001100110001110100001111110101110101110010100100111101000010 0110011000100101011101110100011001000111001101110111111111100101011101101111111110101101110000111000110011001100011001100000001111111101110010101011010111101111000000001000000011101101101010100001111111110011110100010110011100100001111110111111111110101111101001011010101001010010000110000101010011111100001001010111111110101001110010010000000110000101100111001111000001101000100001000001010000111110 1011111000101100000010011100100100010100101000010000111001101010101010010010110011010110110110110000001011100010110100010101110101100011000110101101011110100110010100110001010100101101100001100101101001000010010001001101101001101011101100100010100010101100000110001011000111100001111100100001100000111000010100010110011001010100010111110111010011000000101111011111001111001011101011000001110111110000 1001111111111110101011111101010011000110101101100011010101011000010010010011111100000111110110011110000000011000001110000010010000000110110010000001011101011000100010000111111110101011010000111010100000001011011010100000100100001011001010000001110010110001111010100111111101110011010000010101001001110011100101101111000100000001001000010101011100011100000110100010101100001011011000000100111101001010 1011011110110001001110100010011100100001111101101010001000001010100100111011000010011101001010010001000010110111000010010000001111001111010000101010110000001001011111111110100010001101110011011111010110011010111110001101111000011110111001110000100100100010010010001011101000000101100100111100111001100011110111101011101110110001101010001100001011011111100111110001000110110011101001110001000101011000 1101100101001010000000011000011100111011101001100011110111100101010100000000111100100111000000001111101101110111001001101011010101001101110011101011110111010011101101100000111011001000100011110111100100000000110011111011111101011011011001101111110101101010101010001101100111111001100101011101111000010000111011110000000111110100100111110101101101010111110010111010001101000110010000111010110100010110 0110110000011001100000011010111000110011111001111111101101010010011111101110101000010011011010110111011101101101010100001011101010011011111011010111101110000100000100111001110110111100011000101000111111010111000000111011100010011010011010011010100101011101011000000111010101000010000011011010010110001001011100011010101101111111100010111001100001010011100100001011110110100110001010101001100010011011 1100000101100110100001100000010001100111011010010101000101101110110010111001001000100101000110001001101010011100000001000101010101100111101000110111011111000100011001011101001100110111100001001000001001010101111111111011111001011010010000001000001101011010000000111000010001000101100010011100011101100000111001110011110011111001011010100110001111101000000110100100001100100000110110011100101111100000 1011011000100010111110010001011100111111010111000111101011111010100111111100001010101101110001101010011110000001010101111010000111111001101010000101010100100110000011111001001101000010010010110001011001000000000100000011010110000100000101101111010011001101010101110010000101111101101101011111100000101100010001101010110010010110101101011101101000100011101110000101001011110010110001010110100001101011 1101001010011010001011101011101010011100101111001111001111101110110010010101110001100010101010011000110110100111100100001000000000001001001011011000110101001110100000001111001011110000001101011101100110100001000111011111010011011101101011100010110110011101110011000011110010110011000011110110110011001101001111001110101101100101001000111101010000111101011111110101001100001101000111100011101110011110 1110010101111011010101010110111010110000001110010111110111001111010101010011111001101110101101101010011110011110001000101100011110111000110101101110010001010100001000000101100111011110110011000111000111111011100000110001111101011100010001001000111001111000010111000011001010010110011101111011101000000011011010111010000111000101000000110010101011010001001110101101001110011000001001110101100011000100 1000101010011100011101101011011001100001001000011011011000000010010111010011111001101110101110000100110110011011101110011101011001001111000100011000001011111011010010010010000000111100101001111100001100101100111001101010100111011001000010001110010010000110101101011111111011000011111101010010100100000010101011100010100100111011111000101110001101010100101111111000010111101011101110111011011010011101 1110100101010011000111110110100110100110001011010010111111100001111101010100010111000110110110000011010110110101011100000010110101000110101101010000010101001111010000000011010110101000101100100101101001110001100011111110111111000111000011111000001010111101010000010000011100111100000101011101000011100111000111100010000100011010011000110000010110000011101000001000000011110001110100001101110110100001 0000111100101111100101110111010011110001101101000100010101111011111110011100000001000010100000100001011010110101110111011110101010011101010101111010111011001000011111001101001010100100011101101110011111101001100110001111001011110011010100010111010011110110001001111010000100010100011111100111111111001001011101000100111010010010100101000011001010111000001010001000110110101011110101101000011000011111 1000101010111100011001001011101011011100101010111011110000000001011101101000110111100010110000000010101010101111000101110111010100011101111100111111001011010001000011011100001001100101110000010011100111110001010000010111101011100110100110100101001110010100100111111111111101011011011001010000001111101011101101101101100000010110101101100010010000100101010011110000011100011110100011101001011100010110 0100111111010010101011100000011101111111101101000000110100100001000100101001001111001110010001100111110110011111110110110100101000101110010111110100011100100100101001011000100011101110000111100011000001100111111111001100000101101110000001001011110000011000010100011101111011011010000100110111111001000011011111111010110000100110001001101100101001000100110100001000011010001011101111110110101000010000 1001000100110000001100010111111000010010100010000110100110011011000011000001010011111011001001100101100010011010110110011000010001101010001001011110100011110110101110111100001100101000111110101101010101110000111001110101001101100111101110110000100110000010101000001100010100100000100111010101010100000110010011010011001010100100101110100100110001111011101011011101011000111010110111110100100010110001 0111000101110000010101001001001101010010000010000111000110111001111000111101111100010000110000110001101000101011100100100000011001010011110111000100000000110011001110011101000100100000001101101010100011110010101110111111000110011100110111111010001111100100000001101010001110001010011111100001100000101101010101101010111101010110010011111000010100101001010110110110100111011000111001001011101010011111 0010110110010010100110111000101010111101010000000101011101001010111001101111010110010001110011111011101111001101110010110011010011001001000011101011111111011010010111001101001000110100001000100111010010110011101111000010111111110101100111010101010010101110001000001111011110000101111110010000010010000110100001110110010101000001001010001101001000110100100101110000100100001001011010101100010100100101 1110000101101010001101010100010110011110000011111110001010101110010110110001010110011011110010111010001011101110101000100000011110011101010100000010110110101110010000100011000011101100111000011101010101111010101110100010010011101011110000000110011101101001001100010001000111010110110000111011000001000111010111101101100000010111101101110101000010100100001000010001101011000011110100110001100111010000 1010011110101000010000110101110010010100010000110111100100001000101101100011111010011010011001001111010001111111101100010100010011100001011101111000100100011101100000110010110100011011101101111111111111111110001001010111001111100101011011101100011101001101011111100101011111000001000111110110011001111010110000011001100110101010100111110001011011010111100100001001110110101011001010110111100111101111 0010110001100010001101011011101110111001001111010101111111100111101111010111000000100010010111010100111011011010011011010000101101011000111110011110110010001001011000110100010000101111110000011000110011111011100010100101000110000000001011010010100100101100001101110011010101001100100001100110001001111010111111000011111101001000011000010010110001111001000100101010001101100011010111101110111111010010 1010010001001111111100010110111100011101100101110110100001000100010011101100010110010111101100110101101110011000111110011001001101101000010110101011010101100100000110010000010011100100011100111011111110111010011010010101001000010111010101111010111010110110100110010101010100100101101110110011111000000110001010010111001111011111000001110111100010011111001000000110010101000111110100001110100001000011 0010111111100001010000100001001101010110010101010001000010011100011010011001110001100001010100001001011100010000101111111100000111011111000001001101001111001010000011111011100001111100001000001010111101110000011010100000011110101010111000110011001101000010110101001110000101101001111011011010011000011100110101100010010101011000101111000000111110000110110111011111010101110010000001001100000010110110 0001010010000111111110001000010000010011100100101110011101110010001000000101110111111001001011001010000001111000010100010000101101000101001011001100010010111101100101110010000011001010000111000000001010011000110000010111010011000011101111011100000110110011101001110011101001001100011001100101001110111110000000100111011001001011101111101100101111101110011101110000000111101111001111011001000100010000 0000001001100011101000111000111100101000011001110110110010101101111011111011010100101100100100000110010101000010101110011001010011110010110000110000110110101000101111000010110111100010001110101110111001110000110111111101101000101010000000001101000101111010010100100001001010010011101011011000101111000101000010010110100110100101110101000000100011011111000100100001001101111111000011100100010001101000 0001100001010110000100000010100101000100001011010011001001011111011110000100000010110110101011001001101010101110000011110000111110100001000000110111011011011000000011010111001101000101101100000000000110101111010000011111111110110010111000100000111011001000101101011011100101111011111000101010000001101000001110000101000111011001011000111000111011110110011010000101010010000011100101101100010000000101 1000010010010000001010110001010100111010010111001001000101001100011110100100010110100100100011011100111001001101100111010101001011101101011010010101111100001010010101100010110011000010010111110111110010101110111001100100011101010101000000010100001001101001000010011101001000011110001110010010110100010010110011110000000110001110101100010101000001111000000010010101011100011111111000001100000001000110 0111111000011111000110000100111011001101010000000100011010000000010111111011011110110110101101011010101101110010111101110000111010111110000000000011101001111001101010110001101001000000101111111001001001101011011001100110111100100001010011001011100111100100000001101100010000110111110010111011100110001000110011010100110100110011101101000001110111100010101111011101010010101001000110001101011101001100 0001001010010011001011000001100001011001100101101001001000010010110001001111101111110110101001010011110101110101000110011111111110011010010110001001010100111011001110010011011100100101011000011000001111001011100010000111010000011111001100101100110010111000100001010101001111001110101101101110110010000110000111011111000100011110000011101010111100110001011011011001010001101010010100011101100010010100 0101101000011111111011101111100101110100000010111101111000001101011100001101100010111110010001010100010011111010000110000001100011110001111001100100101101001000001111010000111101111110001001110101000100110100001111010000010001010011100100001011011111001110000101101010010100100010010100100011010010010111001110000101000101100010100101101000110010100100111101100001010110011011000101101111011000000111 1110101111001001001100000011110110011010100111011001100001100111100011101001111011110110011110000101011000100011110111000110111101000011111000010101101111111110011001001011010001111100110011110110101110111110111000111011111011111010001110110100100111101000011001110111101001100000100100101000101000111101011110010011011011101011111101010011011010000011000111000110001101001111000000010010001110000011 1011001001110001000001111111111001101001011001000000001100000000001100111010110111011010101011010101011100011111000110000110001100101000100101001111101010001001111101000111110111000100000000001000101100101010110111110100100011010111111110110101000100010100011011111000100100110100011110111001001101110011101000000010110010100110100000010110101000011000100110100110001000100010101111001000110101000100 0000010010011110000011111001110111010010100000100110111101101111000011101001001100101110110000111101011001011101010000101010010000001011000100000110101001001000111010000001101011110101100000110001010010010011000101111101000001101010000000110101011000010110010101010001111100001000101100001101010011110100010011111011101010101111011100100000100010011010001010010000001101010010001000111011110011010110 0001111001101110111101010001000111011110101110001101001100101100010100100001110110001101001110101100010001010101011000100011101011101000010000001011000000100001001010111100100011100111011001010000011100010110011100110011110111110000011011001101000111100011110010011110010011010100101101011110110111011110111101111110000111010100011111000110010011000110010101100110111010001010000100010100000001000101 0000110000100001111111110101000110111110010101101010111100100011101000001000011101100001010110011000111110001101100001011111011000011000101111011001010010110101001010010011110101101000111101110100101011100000100001100000000000001000011011011010001011010111011100000101010110000001011111001101010111000010000110001110001010100100110010011110101111111100001111010000001101010111101001000100111111110100 0111001001011101110001100011110100111001000110100010101100101011000100100000110010101001011011011000000110000010101111000111000110110001000101111000010000011011011010011011110110001110010001010010010010101010001000110101000011110101101000010100000010011011000011110101100011001110011011000100101101111101011000001101101111101101100111110001010101101111111011101101111101011100011101000111101010100010
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